Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Tkinter中为Python程序更新标签的问题_Python_Tkinter - Fatal编程技术网

如何在Tkinter中为Python程序更新标签的问题

如何在Tkinter中为Python程序更新标签的问题,python,tkinter,Python,Tkinter,因此,我在课堂上编写了一个Python程序,它使用Caesar密码接受用户的输入并将其作为密文输出。因为我有更多的时间做这个项目,我计划在Tkinter中给它一个GUI。但当我将结果密码文本指定给标签时,它不会显示它,并将其保留为空。我是python的高手,更是Tkinter的高手,所以我不太想自己解决这些问题。代码如下: import string import collections import random import tkinter from tkinter import * fro

因此,我在课堂上编写了一个Python程序,它使用Caesar密码接受用户的输入并将其作为密文输出。因为我有更多的时间做这个项目,我计划在Tkinter中给它一个GUI。但当我将结果密码文本指定给标签时,它不会显示它,并将其保留为空。我是python的高手,更是Tkinter的高手,所以我不太想自己解决这些问题。代码如下:

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()

这似乎达到了你的预期。

非常感谢你,伙计,这是一个巨大的帮助。谢谢你这么快回复。