进行匹配输入和if-else

时间:2019-05-31 15:12:55

标签: python python-3.x tkinter

我的脚本在这里

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”,甚至其他任何内容并单击“执行”时,什么也没有发生……为什么什么也没有发生?而我该如何运作呢?

2 个答案:

答案 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