1. ホーム
  2. python

[解決済み] Tkinterのラベルを変数から更新する

2022-02-17 17:17:47

質問

Pythonスクリプトを書きました。このスクリプトは、あるタスクを実行し、文字列変数として格納されているテキストを変更し続けます。これは動作し、文字列が変更されるたびにそれを表示することができます。

ラベルに初めて文字列を表示させることはできますが、更新されることはありません。

以下は私のコードです。

from tkinter import *

outputText = 'Ready'
counter = int(0)

root = Tk()
root.maxsize(400, 400)

var = StringVar()

l = Label(root, textvariable=var, anchor=NW, justify=LEFT, wraplength=398)
l.pack()

var.set(outputText)

while True:
    counter = counter + 1
    outputText = result
    outputText = result
    outputText = result
    if counter == 5:
        break

root.mainloop()

ラベルには Ready しかし、後で生成される文字列にそれを変更するために更新されません。

このサイトでググったり、回答を見たりした結果、解決策は update_idletasks . 変数が変更されるたびにそれを入れてみたのですが、うまくいきませんでした。

どのように解決するのですか?

mainloopに入るとウィンドウが表示されるだけです。ですから、あなたの while True ブロックの前の行 root.mainloop() .


GUIインターフェースは、mainloopの中でイベントに反応することで動作します。ここでは、StringVarがEntryウィジェットにも接続されている例を示します。Entryウィジェットでテキストを変更すると、自動的にLabelも変更されます。

from tkinter import *

root = Tk()
var = StringVar()
var.set('hello')

l = Label(root, textvariable = var)
l.pack()

t = Entry(root, textvariable = var)
t.pack()

root.mainloop() # the window is now displayed

次のような参考文献がいいですね。 tkinter 8.5リファレンス:Python用GUI


以下は、あなたが行おうとしていたことの動作例です。

from tkinter import *
from time import sleep

root = Tk()
var = StringVar()
var.set('hello')

l = Label(root, textvariable = var)
l.pack()

for i in range(6):
    sleep(1) # Need this to slow the changes down
    var.set('goodbye' if i%2 else 'hello')
    root.update_idletasks()

root.update によって保留中のイベントがすべて処理されるまで、イベントループに入る。 Tcl .