簡體   English   中英

在tkinter中使用sys.stdout.write(“\\ r \\ n ...”)

[英]Using sys.stdout.write(“\r…”) in tkinter

我有一個處理數千個小文件的小腳本。 該操作需要一段時間,因此程序將進度輸出到控制台。 它在以下代碼中模擬:

files = 5000 #Number of files
    for i in range(files):
        sys.stdout.write("\r{0} of {1}".format(i, files))

我喜歡這種輸出進度的方式; 控制台中只打印一行。 但是現在我想從GUI(tkinter)運行這個腳本,我希望將輸出打印到狀態欄(標簽)。 我現在有點虧本如何實現這一點。 有沒有辦法在不編輯腳本的情況下處理GUI中的輸出?

雖然你可以截取stdout並隨心所欲地做任何事情,但這是一個壞主意 - 即使你這樣做,你的程序首先也沒有意義。

您無法在GUI應用程序中運行“需要一段時間”的操作。 當操作正在運行時,GUI的主循環未運行,這意味着整個GUI被凍結。 除了給你一個沙灘球,這也意味着你做出的任何改變在你回來之前是不可見的。

如果你在另一個線程中執行操作怎么辦? 那么,它不會阻止GUI運行...但你不能從任何線程但主線程與Tkinter小部件交談,所以這沒有幫助。

因此,您需要做的是一次執行一個操作步驟,每次將其余操作安排為稍后執行的回調。

例如:

class StatusWriter(object):
    def write(self, msg):
        statusbar.config(text=msg[1:])

def count():
    sys.stdout = StatusWriter()
    i = 0
    def step():
        nonlocal i
        sys.stdout.write("\r{} of {}".format(i, 50))
        i += 1
        if i == 50:
            sys.stdout = sys.__stdout__
        else:
            root.after(100, step)
    root.after(100, step)

但實際上,一旦你重寫了一些東西,那么刪除stdout替換hackery也更有意義:

def count():
    sys.stdout = StatusWriter()
    i = 0
    def step():
        nonlocal i
        statusbar.config(text="{} of {}".format(i, 50))
        i += 1
        if i == 50:
            sys.stdout = sys.__stdout__
        else:
            root.after(100, step)
    root.after(100, step)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM