亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:如何從另一個不斷更新的腳本中獲取變量

Python:如何從另一個不斷更新的腳本中獲取變量

冉冉說 2023-03-16 11:28:47
我制作了一個腳本,該腳本使用 while True 循環根據我不斷收到的 UDP 數據包不斷更新一系列變量。我想最終創建一個顯示該數據并不斷更新屏幕的 GUI,我計劃使用 tkinter 來實現(在一個函數中使用 my_label.after 然后調用自身,不確定這是否是一個好計劃)。這是一些我無法正常工作的測試腳本:GUI2.py(我的測試循環腳本)import timevar = 0while True:   var += 1   time.sleep(0.1)GUI Testing.py(將訪問這些變量的腳本)from GUI2 import *import timeprint('never')print(var)time.sleep(1)第二個腳本永遠不會到達 print('never') 行,我認為是因為它卡在另一個腳本的 while True 循環中并且永遠不會返回。我該怎么辦?我有一個腳本,我希望它在一個恒定的循環中根據傳入的數據包將我的變量更新為正確的值,然后另一個腳本更新一個 tkinter 窗口。我這樣做是因為我能找到的大多數使用 Tkinter 的例子都沒有使用任何類型的 while True 循環。我可以將我的數據包接收代碼放在 Tkinter 主循環中嗎,這會有效地充當 while True 嗎?編輯(添加了我無法工作的 Tkinter 循環):這將打開一個 Tkinter 窗口,但標簽保持在 99,然后當我用新的 x 值(即 98、97 等)關閉它時重新打開一個窗口。我希望標簽每秒更新一次。import tkinter as tkimport timex = 99while True:    root = tk.Tk()    label = tk.Label(root, text=x)    label.pack()    x -= 1    time.sleep(1)    root.mainloop()
查看完整描述

2 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

下面是一個示例腳本,向您展示如何以特定時間間隔更新標簽小部件中的值。我為您提供了超鏈接以幫助您理解 tkinter 的方法。此致。

關鍵點:

  • 使用tk.Label 小部件textvariable的選項。

  • 使用tkinter 的控制變量。我已經向您展示了如何設置和獲取它的值。

  • 您可以使用調用的 tkinter 小部件方法,.after()而無需顯式使用 while 語句和time.sleep()方法。Tkinter 有自己的事件循環供您使用。

  • 將你的 tkinter GUI 編寫為一個類可以更容易地實現你需要的東西。

示例腳本:

import tkinter as tk


class App(tk.Frame):

    def __init__( self, master, *args, **kw ):

        super().__init__( master )

        self.master = master

        self.create_label()

        self.update_label()


    def create_label( self ):

        self.var = tk.IntVar() # Holds an int; default value 0

        self.label = tk.Label(self, textvariable=self.var ) # Use textvariable not text 

        self.label.pack()


    def update_label( self ):

        value = self.get_value()

        self.var.set( value ) # Set the label widget textvariable value. 

        self.after(1000, self.update_label) # Call this method after 1000 ms.

    

    def get_value( self ):

        '''To simulate calling a function to return a value'''

        value = self.var.get() + 1

        return value

    

if __name__ == "__main__":

    root = tk.Tk()

    root.geometry('100x100+0+24')


    app = App( root )

    app.pack()


    root.mainloop() #This command activates tkinter's event loop

編輯:

  • 作為澄清,這個答案展示了如何利用.after().mainloop()中的方法GUI Testing.py,即使用 tkinter 事件循環而不是使用兩個 while 循環,來實現你想做的事情。這是一種簡化 GUI 腳本的方法。

  • 對于更復雜的算法,例如涉及多個 while 循環,您必須研究使用線程(注意它有它的問題)或者最近我找到了一種使用 python 的 Asyncio 方法來完成它的方法。這兩種方法的學習曲線要陡峭得多。要使用 asyncio 方法,您可以探索修改我的答案以執行您想要的操作。


查看完整回答
反對 回復 2023-03-16
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

最好的解決方案是使用線程,但是如果您打算以最簡單的方式進行,那么在您的 Tkinter GUI 中實現主循環,一旦您讀取數據包,只需在同一循環中在您的 GUI 上更新它。這是更新后的工作代碼。


import tkinter as tk

import time



def setvalue(self, x):

    self.label.config(text=x, )

    root.update()

    time.sleep(1)


def changevalues(self):

    x = 99

    self.label = tk.Label(root, text=x)

    self.label.pack()

    while x >0:

        x -= 1

        setvalue(root,x)


root = tk.Tk()

changevalues(root)

root.mainloop()


查看完整回答
反對 回復 2023-03-16
  • 2 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號