Example GUI with Python3 and Tkinter
using Place and Pack (grid will be another post)
Widgets used
- window
- canvas
- label
- button
- frame
- circle oval
# -*- coding: utf-8 -*- """ Created on Thu Nov 28 19:30:21 2019 @author: aleja #Focus is on tkinter as GUI only, using place,and pack method (will show grid in another post) Helpful Reference used: https://www.tutorialspoint.com/python3/tk_button.htm https://bytes.com/topic/python/answers/932249-tkinter-button-commands-called-only-startup https://stackoverflow.com/questions/41976546/scrollbar-in-tkinter-inside-text-widget https://stackoverflow.com/questions/3699104/how-to-add-autoscroll-on-insert-in-tkinter-listbox/3699952#3699952 https://stackoverflow.com/questions/28151232/vertical-padding-between-buttons-in-a-column https://stackoverflow.com/questions/30507986/changing-the-colour-on-click-of-a-tkinter-rectangle-on-click-in-python """ from tkinter import * maxLenText=0 #your custom function(s) for when buttons pressed def printtext(strtext): if strtext=="Comp Test": #run Comp Test() TestResult="Pass" if TestResult.find("Fail")>=0: canv.itemconfig(c1, fill='red') else: canv.itemconfig(c1, fill='lightgreen') elif strtext=="Optical Test": #run Optical Test() TestResult="Pass" if TestResult.find("Fail")>=0: canv.itemconfig(c2, fill='red') else: canv.itemconfig(c2, fill='lightgreen') elif strtext=="RF Test": #run RF Test Test() TestResult="Failed- BER subTest" if (TestResult.find("Fail")>=0): canv.itemconfig(c3, fill='red') else: canv.itemconfig(c3, fill='lightgreen') elif strtext=="Restart": #run RF Test Test() TestResult="Cleared Indicator and Text" canv.itemconfig(c1, fill='black') canv.itemconfig(c2, fill='black') canv.itemconfig(c3, fill='black') txt1.delete(1.0,END) else: TestResult="UNKNOWN TEST contact Engineering" print("button press",strtext) global maxLenText txt1.insert(INSERT,(strtext+":"+TestResult+"\n")) txt1.yview(END) LenText=len(strtext+":"+TestResult+"\n") print(maxLenText) if LenText>maxLenText: maxLenText=LenText+1 myWmin=b3x+b3w+b4w+edgegap+maxLenText myWindow.minsize(myWmin,300) txt1frame.winfo_width=myWmin #GUI setup below myWindow=Tk() myWindow.title("myWindow") maxLenText=0 canv=Canvas(myWindow, bd=2, bg= "lightblue") canv.pack(fill=BOTH,expand=YES) edgegap=30 #note the lambda function if you have arg in the funciton ie using (), #remember to add this or printtext("your string") will run once on run # or if there was no arg use printtext WITHOUT the () # the command will be issued on mouse up when over button b1=Button(canv,text="Component Test",command=lambda:printtext("Comp Test")) b1.place(x=edgegap,y=30) canv.update() # can only button true size get after place on canvas b1w=b1.winfo_width() print(b1w) label1=Label(canv,text="Device: Transceiver 5G",fg='yellow',bg='blue') label1.place(x=5,y=5) label2=Label(canv,text="Company Name",fg='yellow',bg='blue') label2.place(x=230,y=5) btnrow=30 b2x=edgegap+b1w b2=Button(canv,text="Optical Test",command=lambda:printtext("Optical Test")) b2.place(x=b2x,y=btnrow) canv.update() b2w=b2.winfo_width() b3x=edgegap+b1w+b2w b3=Button(canv,text="RF Test",command=lambda: printtext("RF Test")) b3.place(x=b3x,y=btnrow) canv.update() b3w=b3.winfo_width() b4x=edgegap+b1w+b2w+b3w b4=Button(canv,text="Restart",command=lambda: printtext("Restart")) b4.place(x=(b4x+10),y=btnrow) canv.update() b4w=b4.winfo_width() #========indicator========= LTRY=60 dia=20 c1=canv.create_oval(70,LTRY,70+dia,LTRY+dia,fill='black') c2=canv.create_oval(150,LTRY,150+dia,LTRY+dia, fill='black') c3=canv.create_oval(210,LTRY,210+dia,LTRY+dia, fill='black') #===Text === txt1frame=Frame(canv,width=50 ,height=20) txt1frame.place(x=30,y=70) txt1frame.pack(side=LEFT,expand=YES,fill=BOTH,pady=(100,10),padx=10) txt1=Text(txt1frame,width=20,height=10) txt1.place(x=0,y=0) #attach a Scrollbar to txt1 vscroll=Scrollbar(txt1frame,orient=VERTICAL,command=txt1.yview) txt1['yscroll']=vscroll.set txt1.pack(side=LEFT,expand=YES,fill=BOTH) vscroll.pack(side=RIGHT,fill=Y) #attempt to autosize window min myWmin=b3x+b3w+b4w+edgegap myWindow.minsize(myWmin,300) myWindow.mainloop()