簡體   English   中英

解決如何在Tkinter中為我的Python程序更新標簽的問題

[英]Issues figuring out how to update labels in Tkinter for my Python program

因此,我在類中編寫了一個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()

這似乎可以達到您的期望。

暫無
暫無

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

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