我正在使用tkinter开发一个python程序,用于gui应用程序来控制机器,它的重要部分正在工作,并且机器已经在工作,但是我希望通过进度条来表示工作进度。我制作了一个与具有进度条的框架相对应的类,但是我无法更改进度条的值,我注意到打印功能似乎都无法执行...我对pythong还是陌生的我正在学习...这真让我感到困惑。
我曾经读过“问题出在您未发布的代码中”,所以我发布了完整的代码:
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import serial
def enviarDato(parametro, valor):
datos = parametro + "=" + valor + "\r\n\0"
print(datos)
print(datos.encode('utf-8'))
ser.write(datos.encode('utf-8'))
def show_frame(ventana, context):
frame = ventana.frames[context]
frame.tkraise()
class StartPage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
ser.port = comEntryString.get()
if ser.is_open == False:
ser.open()
def confirmar():
#ser.port = comEntryString.get()
#if ser.is_open == False:
# ser.open()
print(comEntryString.get())
metrosInt = int(metrosTrabajoString.get())
diametroFloat = float(diametroCableString.get())
largoBobinadoFloat = float(largoBobinadoString.get())
oneRevSteps = str(int((3200.0/4.0)*diametroFloat))
vueltasPorCapa = str(int(largoBobinadoFloat/diametroFloat))
# vueltasTrabajo =
jobStep = 0
if(comboBoxDiametro.get() == ""):
messagebox.showwarning("Advertencia", "Elegir AWG/mm para diámetro")
jobStep = -1
if(jobStep >= 0):
enviarDato('oneRev', oneRevSteps)
print("respuesta micro a oneRev:")
print(ser.readline())
print("---")
if(comboBoxModo.get()=="Vueltas"):
enviarDato('vueltasJob', metrosTrabajoString.get())
print("respuesta micro a vueltasJob:")
print(ser.readline())
print("---")
enviarDato('vueltasCap', vueltasPorCapa)
print("respuesta micro a vueltasCap:")
print(ser.readline())
print("---")
if(comboBoxModo.get()=="Metros"):
enviarDato('met', metrosTrabajoString.get())
print("respuesta micro a met:")
print(ser.readline())
print("---")
if (comboBoxDiametro.get() == "AWG"):
enviarDato('diamAWG', diametroCableString.get())
print("respuesta micro a diamAWG:")
print(ser.readline())
print("---")
if (comboBoxDiametro.get() == "mm"):
enviarDato('diam', diametroCableString.get())
print("respuesta micro a diam:")
print(ser.readline())
print("---")
enviarDato('long', largoBobinadoString.get())
print("respuesta micro a long:")
print(ser.readline())
print("---")
if metrosInt > 10:
print("esta wea es mayor q 10")
else:
print("esta wea es menor o igual q 10")
respuesta = messagebox.askquestion('Confirmar datos',"Confirma los siguientes datos:\n" + metrosTrabajoString.get() + " mt\n" + diametroCableString.get() + " diámetro\n" + largoBobinadoString.get() + " largo")
if respuesta == "yes":
respuestaInicio = messagebox.askquestion('Puesta en Marcha', 'Iniciar máquina')
if respuestaInicio == "yes":
messagebox.showinfo("Inicio", "Iniciando máquina")
enviarDato('startJob', '1')
print("respuesta micro a startJob:")
print(ser.readline())
print("---")
frame = ventana.frames[ProgressPage]
frame.tkraise()
etiqueta = Label(self, text="Ingreso de parámetros de trabajo")
#etCantidad = Label(self, text="Cantidad de metros")
comboBoxModo = ttk.Combobox(self, state="readonly", width=13, values=["Metros", "Vueltas"], justify="right")
metrosTrabajoEntry = Entry(self, textvariable=metrosTrabajoString)
# metrosLabelUnit = Label(self, text="mt", width=5)
#metrosLabelUnit.grid(row=1, column=2, sticky=W)
#etCantidad.grid(row=1, sticky=E)
metrosTrabajoEntry.grid(row=1, column=1)
comboBoxModo.grid(row=1, sticky=E)
etDiametro = Label(self, text="Diámetro de Cable")
diametroCableEntry = Entry(self, textvariable=diametroCableString)
comboBoxDiametro = ttk.Combobox(self, state="readonly", width=5, values=["AWG", "mm"], justify="right")
etDiametro.grid(row=2, sticky=E)
diametroCableEntry.grid(row=2, column=1)
comboBoxDiametro.grid(row=2, column=2,sticky=W)
etLargoBobinado = Label(self, text="Largo de Bobinado")
largoBobinadoEntry = Entry(self, textvariable=largoBobinadoString)
labelLargoUnit = Label(self, text="cm", width=5)
etLargoBobinado.grid(row=3, sticky=E)
largoBobinadoEntry.grid(row=3, column=1)
labelLargoUnit.grid(row=3, column=2, sticky=W)
comEntryLabel = Label(self, text="COM Channel")
comEntryLabel.grid(row=4,column=0,sticky=E)
comEntry = Entry(self, textvariable=comEntryString)
comEntry.grid(row=4,column=1)
boton = Button(self, text="Confirmar parámetros", command=confirmar)
boton.grid(row=4, column=2, sticky=W)
# barraProgreso.update()
class ProgressPage(Frame):
def __init__(self, parent, controller):
Frame.__init__(self, parent)
self.print("progres")
self.barVal = 0
self.barValVar = tk.IntVar()
display=Label(self, text="Progreso")
display.grid(row=1, column=1, sticky=N)
barraProgreso = ttk.Progressbar(self, orient='horizontal', length=350, mode='determinate', variable=self.barVal)
barraProgreso.grid(row=1, column=1, sticky=N)
barValVar.set(50)
while barVal != 100:
print("entro")
msg = ser.readline()
barVal += 1
print(msg)
if msg == "b+":
barValVar.set(barVal)
ventana = Tk()
metrosTrabajoString = StringVar()
diametroCableString = StringVar()
largoBobinadoString = StringVar()
comboBoxDiamString = StringVar()
comEntryString = StringVar()
ser = serial.Serial(baudrate=9600, timeout=1, parity=serial.PARITY_EVEN)
ventana.title("Máquina Bobinadora")
container = Frame(ventana)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
ventana.frames = {}
for F in (StartPage, ProgressPage):
frame = F(container, ventana)
ventana.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
frame = ventana.frames[StartPage]
frame.tkraise()
windowWidth = ventana.winfo_reqwidth()
windowHeight = ventana.winfo_reqheight()
# Gets both half the screen width/height and window width/height
positionRight = int(ventana.winfo_screenwidth() / 2 - windowWidth / 2)
positionDown = int(ventana.winfo_screenheight() / 2 - windowHeight / 2)
# Positions the window in the center of the page.
ventana.geometry("+{}+{}".format(positionRight, positionDown))
menu = Menu(ventana)
ventana.config(menu=menu)
subMenu = Menu(menu)
menu.add_cascade(label="Archivo", menu=subMenu)
subMenu.add_command(label="Salir", command=ventana.quit)
#ventana.geometry("960x420")
ventana.mainloop()
有什么想法为什么不起作用? :(
答案 0 :(得分:0)
有两件事。
创建名称为self.barVal
的变量时,不能使用名称barVal
来引用它。名称是不同的,python会认为它们是不同的变量。 self.barValVar
也是如此。
您已将进度条与错误的变量关联:variable=self.barVal
。您想要的IntVar()
是self.barValVar
。
否则,它将看起来可行。我在一个效果很好的较短代码段上对此进行了测试:
from tkinter import *
from tkinter import ttk
class ProgressPage(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
print("progres")
self.pack()
self.barVal = 0
self.barValVar = IntVar()
display = Label(self, text="Progreso")
display.grid(row=1, column=1, sticky=N)
barraProgreso = ttk.Progressbar(self, orient='horizontal',
length=350, mode='determinate',
variable=self.barValVar)
barraProgreso.grid(row=1, column=1, sticky=N)
self.barValVar.set(50)
while self.barVal != 100:
print("entro", self.barVal)
self.barVal += 1
msg = "b+"
if msg == "b+":
self.barValVar.set(self.barVal)
barraProgreso.update()
root = Tk()
ProgressPage(root)
root.mainloop()