从Class函数输出文本? -Tkinter

时间:2019-04-04 23:20:09

标签: python tkinter

如果我使用的术语不正确,我深表歉意,因为我是Python的新手,所以我一直在悠闲地玩耍。我正在尝试通过观看一些教程和在线阅读来弄清楚自己的一切。我遇到的问题是我想为python密码生成器创建一个GUI(非常简单的第一个项目。)我创建了我认为正确的格式,但是该函数在GUI窗口而不是终端。我认为这是当我进入self.output时,一切都弄糟了。

class GenPass:
    def __init__(self, master):
        frame = Frame()
        frame.pack()

        self.printButton = Button(frame, text="Generate Password", padx=4, pady=4, command=self.generate)
        self.printButton.pack(side=LEFT)

        self.quitButton = Button(frame, text="Copy to Clipboard", padx=4, pady=4, command=master.destroy)
        self.quitButton.pack(side=LEFT)

        self.output = Label(frame, fg="Green")
        self.output.place(x=240, y=85)
        self.output.config(text=self.generate)

    def generate(self):
        for i in range(3):
            print(random.choice(Words).capitalize(), end='')
        for i in range(2):
            print(random.choice(Numbers), end='')
        for i in range(1):
            print(random.choice(Spec_Char))

我希望结果在GUI窗口中,并且会生成密码。它出现在终端中,但不在窗口中。通过对output.pack()进行调整时,它只会列出随机数和函数名称(例如9012381generate)

1 个答案:

答案 0 :(得分:1)

generate内,您应该使用密码创建字符串,并使用self.output.config(text=password)而不是print()

我更改了代码,因为它对我不起作用。现在每个人都可以复制代码并运行它。

from tkinter import *
import random
import string

words = string.ascii_uppercase
numbers = string.digits
spec_char = '!@#$%'

class GenPass:

    def __init__(self, master):
        frame = Frame(master) # add parent for Frame
        frame.pack()

        self.printButton = Button(frame, text="Generate Password", padx=4, pady=4, command=self.generate)
        self.printButton.pack(side=LEFT)

        self.quitButton = Button(frame, text="Copy to Clipboard", padx=4, pady=4, command=master.destroy)
        self.quitButton.pack(side=LEFT)

        self.output = Label(master, fg="Green")
        self.output.pack()

        self.generate() # genrate password at start


    def generate(self):
        password = ''
        for i in range(3):
            password += random.choice(words)
        for i in range(2):
            password += random.choice(numbers)
        for i in range(1):
            password += random.choice(spec_char)
        self.output.config(text=password)


root = Tk()
GenPass(root)
root.mainloop()

enter image description here

顺便说一句:每个小部件都应该有父级,因此我在master中添加了Frame()。也许这没有什么区别,但是如果您有很多框架或小部件,那么没有父级的小部件就会显示在意外的位置。

pack()place()grid()不应在一个窗口或一帧中混合,因为pack()grid()试图动态计算位置和其他布局经理可以解决这个问题。但是,使用pack/grid/place可以放置frame,并且可以在此frame内使用其他的layour manager(pack/grid/place)。