类中的部分代码不起作用(PYTHON)

时间:2018-11-20 14:49:30

标签: python function class user-interface tkinter

我正在使用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()

有什么想法为什么不起作用? :(

1 个答案:

答案 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()