【问题标题】:python tkinter, sensor value wont refresh [duplicate]python tkinter,传感器值不会刷新[重复]
【发布时间】:2016-05-03 11:40:13
【问题描述】:

大家好,我在使用我创建的 python gui 应用程序时遇到了一些问题,该应用程序运行良好,除非我单击传感器模式按钮。值“m”与 gui - 应用程序首次加载且不刷新时保持相同。上个月我才开始使用 tkinter,我正在努力理解如何实现 while 循环或类似的东西。我在 main 中放置了一个 while 循环,它似乎只是在我关闭应用程序时重新打开它。该应用程序是在我的 raspberryPi 上创建的,所以我注释掉了所有 gpio 和 raspberrypi 的东西,所以它可以在 pc 上运行。该应用程序基本上是 2 种模式,一个计时器模式和一个传感器模式,虽然我没有为当值 m“传感器”下降到 50% 以下时添加任何功能,但是我已经有一个不同的传感器程序,当我得到时我会使用要更新的传感器。

可能有人请修复我的应用程序,以便传感器值 m - mpc3008 不断刷新。

    # made by edwin martin 02/05/2016

    #!/usr/bin/python
    from datetime import datetime
    from threading import Timer
    import sys
    import time
    import threading
    import tkinter
    from tkinter import *
    from time import sleep
    from time import sleep
    #t1 = 0
    #t2 = 0
    #t3 = 0
    #t4 = 0

    class simpleapp_tk(tkinter.Tk, threading.Thread):
        def __init__(self,parent):
            tkinter.Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
            self.minsize(width=720, height=180)
            self.maxsize(width=720, height=240)
        def initialize(self):
            self.grid()
    #lables
            self.labelVariable2 = tkinter.StringVar()
            label2 = tkinter.Label(self,textvariable=self.labelVariable2,
                                  anchor="w",fg="white",bg="blue")
            label2.grid(column=0,row=0,columnspan=2,sticky='EW')
            self.labelVariable2.set(u"ENTER THE HOUR FOR THE START TIME ")

            self.entryVariable = tkinter.IntVar()
            self.entry = tkinter.Entry (self,textvariable=self.entryVariable)
            self.entry.grid(column=0,row=1,sticky='EW')
            self.entry.bind("<Return>", self.OnPressEnter)
            self.entryVariable.set(u"Enter text here.")

            self.labelVariable = tkinter.StringVar()
            label = tkinter.Label(self,textvariable=self.labelVariable,
                                  anchor="w",fg="black",bg="yellow")
            label.grid(column=0,row=2,columnspan=2,sticky='EW')
            self.labelVariable.set(u"")

            self.labelVariable4 = tkinter.StringVar()
            label4 = tkinter.Label(self,textvariable=self.labelVariable4,
                                  anchor="w",fg="white",bg="blue")
            label4.grid(column=0,row=3,columnspan=2,sticky='EW')
            self.labelVariable4.set(u"ENTER THE MINUTE FOR THE START TIME")

            self.entryVariable2 = tkinter.IntVar()
            self.entry = tkinter.Entry(self,textvariable=self.entryVariable2)
            self.entry.grid(column=0,row=4,sticky='EW')
            self.entry.bind("<Return>", self.OnPressEnter)
            self.entryVariable2.set(u"Enter text here.")

            self.labelVariable1 = tkinter.StringVar()
            label5 = tkinter.Label(self,textvariable=self.labelVariable1,
                                  anchor="w",fg="black",bg="grey")
            label5.grid(column=0,row=6,columnspan=2,sticky='EW')

            self.labelVariable3 = tkinter.StringVar()
            label3 = tkinter.Label(self,textvariable=self.labelVariable3,
                                  anchor="w",fg="black",bg="yellow")
            label3.grid(column=0,row=5,columnspan=2,sticky='EW')
    #buttons

            button = tkinter.Button(self,text=u"ENTER",
                                    command=self.OnButtonClick,anchor="w",fg="black",bg="green")
            button.grid(column=1,row=1)

            button2 = tkinter.Button(self,text=u"ENTER",
                                    command=self.OnButtonClick2,anchor="w",fg="black",bg="green")
            button2.grid(column=1,row=4)

            button3 = tkinter.Button(self,text="START TIMER",
                                    command=self.OnButtonClick3,anchor="w",fg="black",bg="green")
            button3.grid(column=0,row=6)

            button4 = tkinter.Button(self,text="PREVIEW PAGE",
                                    command=self.OnButtonClick4,anchor="w",fg="black",bg="green")
            button4.grid(column=1,row=6)

            button5 = tkinter.Button(self,text="SENSOR MODE",
                                    command=self.OnButtonClick5,anchor="w",fg="black",bg="purple")
            button5.grid(column=0,row=9)

            self.labelVariable7 = tkinter.StringVar()
            label7 = tkinter.Label(self,textvariable=self.labelVariable7,
                                    anchor="w",fg="black",bg="white")
            label7.grid(column=0,row=8,columnspan=2,sticky='EW')

            self.labelVariable8 = tkinter.StringVar()
            label8 = tkinter.Label(self,textvariable=self.labelVariable8,anchor="w",fg="black",bg="pink")
            label8.grid(column=0,row=7,columnspan=2,sticky='EW')

            self.grid_columnconfigure(0,weight=1)
            self.resizable(True,False)
            self.update()
            self.geometry(self.geometry())       
            self.entry.focus_set()
            self.entry.selection_range(0, tkinter.END)

        def light_on(self):
            print ("led on")
            self.grid()
            self.labelVariable7 = tkinter.StringVar()
            label7 = tkinter.Label(self,textvariable=self.labelVariable7,
                                    anchor="w",fg="black",bg="red")
            label7.grid(column=0,row=8,columnspan=2,sticky='EW')
            self.labelVariable7.set(u"!!WATERING !!")
            slep(5)
            self.grid()
            self.labelVariable7 = tkinter.StringVar()
            label7 = tkinter.Label(self,textvariable=self.labelVariable7,
                                    anchor="w",fg="black",bg="white")
            label7.grid(column=0,row=8,columnspan=2,sticky='EW')
            self.labelVariable7.set(u"")

        def OnButtonClick(self):
            self.labelVariable.set( "You entered: " + str(self.entryVariable.get()))
            self.entry.focus_set()
            self.entry.selection_range(0, tkinter.END)

        def OnButtonClick2(self):
            self.labelVariable3.set( "You entered: " + str(self.entryVariable2.get()))
            self.entry.focus_set()
            self.entry.selection_range(0, tkinter.END)

        def OnButtonClick3(self):
            time=datetime.today()
            int (self.entryVariable.get())
            int (self.entryVariable2.get())
            start=time.replace(day=time.day, hour=self.entryVariable.get(), minute=self.entryVariable2.get(), second=0, microsecond=0)
            delta_t=start-time
            secs=delta_t.seconds+1
            timer = Timer(secs,self.light_on)
            timer.start()
            self.labelVariable8 = tkinter.IntVar()
            label8 = tkinter.Label(self,textvariable=self.labelVariable8,
                                    anchor="w",fg="black",bg="pink")
            label8.grid(column=0,row=7,columnspan=2,sticky='EW')
            if self.entryVariable.get() >= 12:
                self.labelVariable8.set( "start time: " + str(self.entryVariable.get())+ ":" + str(self.entryVariable2.get()) + "pm")
            elif self.entryVariable.get() < 12:
                self.labelVariable8.set( "start time: " + str(self.entryVariable.get())+ ":" + str(self.entryVariable2.get()) + "am")

        def OnButtonClick4(self):
            for widget in app.winfo_children():
                widget.destroy()
                self.grid()
                self.labelVariable2 = tkinter.StringVar()
                label2 = tkinter.Label(self,textvariable=self.labelVariable2,
                                      anchor="w",fg="white",bg="blue")
                label2.grid(column=0,row=0,columnspan=2,sticky='EW')
                self.labelVariable2.set(u"WATERING START TIME ")

                self.labelVariable = tkinter.IntVar()
                label = tkinter.Label(self,textvariable=self.labelVariable,
                                      anchor="w",fg="black",bg="pink")
                label.grid(column=0,row=1,columnspan=2,sticky='EW')



        def OnPressEnter(self,event):
            print("enter button pressed\nplease use the mouse instead !")

#NOT WORKING IN THIS SECTION WHERE M IS CALLED , THE VALUE JUST STAYS THE SAME AND DOES NOT REFRESH    ???????

        def display(self):
            self.grid()
            self.labelVariable = tkinter.IntVar()
            label = tkinter.Label(self,textvariable=self.labelVariable,
                                    anchor="w",fg="black",bg="pink")
            label.grid(column=0,row=1,columnspan=2,sticky='EW')
            self.labelVariable.set("Water Level:%d%%" % m)

        def OnButtonClick5(self):


# THIS IS JUST SHOWING AFTER 2  SECONDS, I WANT TO REFRESH EVERY 2 SECONDS              
            app.after(200, self.display)
# WORKING OK HERE THIS JUST DISPLAYS A HEADER FOR THE SENSOR PAGE       
            for widget in app.winfo_children():
                widget.destroy()
                self.grid()
                self.labelVariable2 = tkinter.StringVar()
                label2 = tkinter.Label(self,textvariable=self.labelVariable2,
                                      anchor="w",fg="white",bg="blue")
                label2.grid(column=0,row=0,columnspan=2,sticky='EW')
                self.labelVariable2.set(u"WATERING LEVEL")
# M IS LOADED HERE BUT DOES NOT REFRESH
    if __name__ == "__main__":
             #m = mcp3008.readadc(5)/10+19
             app = simpleapp_tk(None)
             app.title('WATER BUDDY APP') 
             app.mainloop()

最后一部分是问题所在

       def display(self):
            self.grid()
            self.labelVariable = tkinter.IntVar()
            label = tkinter.Label(self,textvariable=self.labelVariable,
                                    anchor="w",fg="black",bg="pink")
            label.grid(column=0,row=1,columnspan=2,sticky='EW')
            self.labelVariable.set("Water Level:%d%%" % m)

        def OnButtonClick5(self):
# THIS IS JUST SHOWING AFTER 2  SECONDS, I WANT TO REFRESH EVERY 2 SECONDS              
            app.after(200, self.display)
# WORKING OK HERE THIS JUST DISPLAYS A HEADER FOR THE SENSOR PAGE       
            for widget in app.winfo_children():
                widget.destroy()
                self.grid()
                self.labelVariable2 = tkinter.StringVar()
                label2 = tkinter.Label(self,textvariable=self.labelVariable2,
                                      anchor="w",fg="white",bg="blue")
                label2.grid(column=0,row=0,columnspan=2,sticky='EW')
                self.labelVariable2.set(u"WATERING LEVEL")
# M IS LOADED HERE BUT DOES NOT REFRESH
    if __name__ == "__main__":
             #m = mcp3008.readadc(5)/10+19
             app = simpleapp_tk(None)
             app.title('WATER BUDDY APP') 
             app.mainloop()

【问题讨论】:

  • 你能把你的例子减少到最低限度吗?这有助于人们了解问题可能出在哪里
  • 我快速编辑了代码,所以它仍然可以运行,并将它的大写 cmets 放在问题所在的地方,仅供参考,问题位于函数 display 的代码底部,并且主要
  • @edwin 我相信他们要求您提供MCVE。使用 Tkinter 和这个特定的问题应该需要 10-15 行或更少的代码。但是,无论如何,这都是重复的。另请注意 - after 需要几毫秒。 200 将每 0.2 秒刷新一次。你想要 2000,持续 2 秒。
  • 我会调查你链接的内容。哦,好吧,我不知道 MCVE 是什么。吸取的教训,感谢您的支持:)。是的,当我昨晚再读一遍时,我意识到那是 ms。非常感谢 edd

标签: python loops tkinter


【解决方案1】:

WOOOO ty 韦恩 :) 是的,我所要做的就是更改 1 行并粘贴另一行。 再次感谢。

   def display(self):
        import mcp3008
        m = mcp3008.readadc(5)/10+19
        self.grid()
        self.labelVariable = tkinter.IntVar()
        label = tkinter.Label(self,textvariable=self.labelVariable,
                                anchor="w",fg="black",bg="pink")
        label.grid(column=0,row=1,columnspan=2,sticky='EW')
        self.labelVariable.set("Water Level:%d%%" % m)
        self.after(200, self.display)
    def OnButtonClick5(self):
        app.after(200, self.display)    
        for widget in app.winfo_children():
            widget.destroy()
            self.grid()
            self.labelVariable2 = tkinter.StringVar()
            label2 = tkinter.Label(self,textvariable=self.labelVariable2,
                                  anchor="w",fg="white",bg="blue")
            label2.grid(column=0,row=0,columnspan=2,sticky='EW')
            self.labelVariable2.set(u"WATERING LEVEL")
if __name__ == "__main__":
         app = simpleapp_tk(None)
         app.title('WATER BUDDY APP') 
         app.mainloop()

【讨论】:

  • 一旦它开始我如何停止这个循环,因为我现在在传感器页面中做了一个返回计时器按钮但是当它加载页面时,计时器继续运行并与新页面重叠???? ?
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多