如何在Tkinter中为Python程序更新标签的问题
因此,我在课堂上编写了一个Python程序,它使用Caesar密码接受用户的输入并将其作为密文输出。因为我有更多的时间做这个项目,我计划在Tkinter中给它一个GUI。但当我将结果密码文本指定给标签时,它不会显示它,并将其保留为空。我是python的高手,更是Tkinter的高手,所以我不太想自己解决这些问题。代码如下:如何在Tkinter中为Python程序更新标签的问题,python,tkinter,Python,Tkinter,因此,我在课堂上编写了一个Python程序,它使用Caesar密码接受用户的输入并将其作为密文输出。因为我有更多的时间做这个项目,我计划在Tkinter中给它一个GUI。但当我将结果密码文本指定给标签时,它不会显示它,并将其保留为空。我是python的高手,更是Tkinter的高手,所以我不太想自己解决这些问题。代码如下: import string import collections import random import tkinter from tkinter import * fro
import string
import collections
import random
import tkinter
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("Encoder")
root.geometry("500x400")
def caesar(rotate_string, number_to_rotate_by):
upper = collections.deque(string.ascii_uppercase)
lower = collections.deque(string.ascii_lowercase)
upper.rotate(number_to_rotate_by)
lower.rotate(number_to_rotate_by)
upper = ''.join(list(upper))
lower = ''.join(list(lower))
return rotate_string.translate(str.maketrans(string.ascii_uppercase, upper)).translate(str.maketrans(string.ascii_lowercase, lower))
def callback():
print (code)
b = Button(root, text="get", width=10, command=callback)
b.pack()
var = StringVar()
e = Entry(root, textvariable = var)
e.pack()
our_string = e.get()
random_number = random.randint(1,25)
code = caesar(our_string, random_number)
l = Label(root, textvariable=code, anchor=NW, justify=LEFT, wraplength=398)
l.pack()
l.place(relx=0.5, rely=0.5, anchor=CENTER)
root.mainloop()
您发布的代码有几个问题。首先也是最重要的一点,回调函数除了打印
code
变量外,什么都不做。您需要将调用移动到caesar
,并将相关代码移到回调中,如下所示
def callback():
global code
our_string = e.get()
random_number = random.randint(1, 25)
code.set(caesar(our_string, random_number))
我看到的第二个问题是,为了让标签自动更新,需要在Label
构造函数中使用StringVar
作为textvariable
参数。说到底,我的代码版本如下
import string
import collections
import random
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("Encoder")
root.geometry("500x400")
code = StringVar()
code.set('Hello')
def caesar(rotate_string, number_to_rotate_by):
upper = collections.deque(string.ascii_uppercase)
lower = collections.deque(string.ascii_lowercase)
upper.rotate(number_to_rotate_by)
lower.rotate(number_to_rotate_by)
upper = ''.join(list(upper))
lower = ''.join(list(lower))
return rotate_string.translate(str.maketrans(string.ascii_uppercase, upper)).translate(str.maketrans(string.ascii_lowercase, lower))
def callback():
global code
our_string = e.get()
random_number = random.randint(1, 25)
code.set(caesar(our_string, random_number))
b = Button(root, text="get", width=10, command=callback)
b.pack()
var = StringVar()
e = Entry(root, textvariable=var)
e.pack()
l = Label(root, textvariable=code, anchor=NW, justify=LEFT, wraplength=398)
l.pack()
l.place(relx=0.5, rely=0.5, anchor=CENTER)
root.mainloop()
这似乎达到了你的预期。非常感谢你,伙计,这是一个巨大的帮助。谢谢你这么快回复。