当我试图在主题中表达我想要的是每当从弹出窗口单击确定按钮时,我希望它存储在变量主机中。
打印很容易,但我想把它放在我的变量主机里面,有办法吗?
from tkinter import *
class dialog():
def __init__(self,master,question):
root=Toplevel(master)
root.geometry('200x84+20+15')
root.overrideredirect(True)
root.config(background='grey')
quetsion=question.capitalize()
Label(root,text=quetsion,bg='grey',fg='white',justify='center').grid(column=0,row=0,sticky=N+W,padx=50)
text=StringVar()
Entry(root,textvariable=text,bg='grey',fg='white',justify='center',width=30).grid(column=0,row=1,sticky=N+W,padx=8,pady=5)
Button(root,text='Ok',bg='grey',fg='white',width=11,justify='center',command=lambda:self.ok(text.get())).grid(column=0,row=2,sticky=N+W,padx=8,pady=5)
Button(root,text='Cancle',bg='grey',fg='white',width=11,justify='center',command=lambda:self.close(root)).grid(column=0,row=2,sticky=N+W,pady=5,padx=105)
def ok(self,value):#the OK function for the OK button
return value #the value to be put inside host when the OK button is clicked
def close(self,master):
master.destroy()
win=Tk()
win.geometry('0x0+0+0')
host=dialog(win,'What is your name')
print(host)
win.mainloop()
还有tkinter简单对话如何做到这一点?我试图阅读源代码,但目前尚不清楚。
答案 0 :(得分:1)
要使其正常工作,您需要更改几件事。
首先,我们需要解决课程中的一些问题。
您需要在此处使用类属性,并且您需要至少分配输入字段和标签作为类属性,以便能够更新标签文本。您还需要在创建按钮后设置grid()
位置,否则当您尝试在输入字段上使用get()
或尝试更新标签时,您将获得None
返回来自几何经理。
您在这里不需要字符串变量,因为您使用按钮来调用方法来更新您可以在输入字段上使用get()
的文本。
我们也可以将master引用到这样的类属性:
self.root = master
这将允许我们在任何方法中与self.root属性进行交互,而不必将其作为参数传递。
因此,对于您的close()
方法,您可以执行self.root.destroy()
,它可以正常工作。
话虽如此,你应该确保创建不会覆盖python中已经是方法的唯一名称。例如,close
已在python中用于关闭打开的文件。因此,如果您开始使用pythons close方法,而不是命名方法close()
,您应该执行类似close_app()
的操作,这样可以防止出现任何问题。
在一个类中,您需要确保在程序初始化之后需要多次调用或在方法中调用的任何内容已将其分配给具有self.
的类属性
现在我们已经清理了一下类,我们可以通过更新host
然后打印它来解决您的问题。
因为您一次只能运行一个tkinter应用程序。您可以创建一个窗口(对话框类)来更新全局变量(您的host
变量),然后将其自行关闭。一旦dialog()
关闭,python程序的其余部分将在mainloop()
之后运行,因此我们可以编写一些代码来使用host
或甚至另一个tkinter应用程序的值。
看看下面的代码:
from tkinter import *
class dialog():
def __init__(self, master, question):
# removed Toplevel() because you code did not show a root window
# so top level is not needed here.
# If you would like this to be a Toplevel called from another class
# Then you can change self.root = master back to self.root = Toplevel(master)
self.root = master
self.root.geometry('200x84+20+15')
self.root.overrideredirect(True)
self.root.config(background='grey')
quetsion=question.capitalize()
self.lbl1 = Label(self.root, text=quetsion, bg='grey', fg='white', justify='center')
self.lbl1.grid(column=0,row=0,sticky=N+W,padx=50)
self.entry1 = Entry(self.root, bg='grey', fg='white', justify='center', width=30)
self.entry1.grid(column=0,row=1,sticky=N+W,padx=8,pady=5)
Button(self.root, text='Ok', bg='grey', fg='white', width=11, justify='center',
command=lambda:self.ok(self.entry1.get())).grid(column=0,row=2,sticky=N+W,padx=8,pady=5)
Button(self.root, text='Cancel', bg='grey', fg='white', width=11, justify='center',
command=lambda:self.close_app()).grid(column=0,row=2,sticky=N+W,pady=5,padx=105)
def ok(self, value):
global host
if self.entry1.get() != "":
host = self.entry1.get()
self.root.destroy()
def close_app(self):
self.root.destroy()
win=Tk()
win.geometry('0x0+0+0')
host = ""
dialog(win,'What is your name')
win.mainloop()
win = Tk()
Label(win, text="The host name is {}".format(host)).pack()
Button(win, text="Close", command = lambda: win.destroy()).pack()
win.mainloop()