我的脚本在这里
from tkinter import *
from tkinter import messagebox
import commands
db=''
def launch():
# Database Check.
if db.lower() == 'y':
commands.db_download()
else:
db.lower() == 'n'
root = Tk()
checklabel = Label(root, text="Check for new databases? Y/N: ")
checkentree = Entry(root, textvariable=db)
checkbutton = Button(root, text="Go", command=launch)
checklabel.pack()
checkentree.pack()
checkbutton.pack()
root.mainloop()
除匹配部分外,其他所有东西都起作用。 当我在“输入”框中输入“ y”或“ n”,甚至其他任何内容并单击“执行”时,什么也没有发生……为什么什么也没有发生?而我该如何运作呢?
答案 0 :(得分:2)
checkentree = Entry(root, textvariable=db)
textvariable
参数应为StringVar。但是db
是一个字符串,而不是StringVar。
尝试改为传递StringVar。
from tkinter import *
from tkinter import messagebox
import commands
def launch():
# Database Check.
if db.get().lower() == 'y':
commands.db_download()
#don't actually need these following lines because they don't do anything
#else:
# #db.get().lower() == 'n'
root = Tk()
db=StringVar()
checklabel = Label(root, text="Check for new databases? Y/N: ")
checkentree = Entry(root, textvariable=db)
checkbutton = Button(root, text="Go", command=launch)
checklabel.pack()
checkentree.pack()
checkbutton.pack()
root.mainloop()
答案 1 :(得分:2)
您需要进行1项更改,并进行一些修改是个好主意。
首先需要“更改”:
在tkinter窗口小部件中使用textvaraible
时,必须使用ObjectVars之一(即:StringVar,IntVar等)。还请记住,您将需要在.get()
上使用db
,因为get()
方法是从ObjectVar获取值的方法。
要完成此更改,请执行以下操作:
db = ''
def launch():
if db.lower() == 'y':
对此:
db = tk.StringVar()
db.set('') # not actually required in this instance but still good to know how to set the value of a ObjectVar.
def launch():
if db.get().lower() == 'y':
将您的db
tkinter代码移到root
之后,否则StringVar会抛出此错误AttributeError: 'NoneType' object has no attribute '_root'
,因为您尚未启动tk实例来锁定StringVar
那就是说,您还应该更改导入tkinter的方式,也许还要清理小部件名称和打包方式。
最好使用import tkinter as tk
而不是from tkinter import *
,因为这有助于防止意外覆盖其他导入或您自己的变量/函数/类名的导入。要使用这种新的导入方法,您只需为每种方法/小工具使用前缀tk.
。
如果您不打算在未来修改窗口小部件(即永久标签,按钮等),则无需将其分配给变量,只需使用几何管理器即可(在这种情况下,{{ 1}})上。
最后,您的pack()
陈述不完全正确。它将起作用,但是此行if/else
并未按照您认为的去做。 db.lower() == 'n'
语句没有任何条件可以满足。这只是else
语句中的最后一个选项,如果不满足其他任何条件,该选项将运行。也就是说,如果您什么都没有,并且不满足其他任何条件,则可以简单地删除逻辑语句的if/elif/else
部分。
看看下面的代码:
else