如果我使用的术语不正确,我深表歉意,因为我是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)
答案 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()
顺便说一句:每个小部件都应该有父级,因此我在master
中添加了Frame()
。也许这没有什么区别,但是如果您有很多框架或小部件,那么没有父级的小部件就会显示在意外的位置。
pack()
和place()
和grid()
不应在一个窗口或一帧中混合,因为pack()
和grid()
试图动态计算位置和其他布局经理可以解决这个问题。但是,使用pack/grid/place
可以放置frame
,并且可以在此frame
内使用其他的layour manager(pack/grid/place
)。