【问题标题】:Beginners Problem! NameError on python tkinter初学者问题! python tkinter上的NameError
【发布时间】:2021-07-15 15:40:07
【问题描述】:

python 新手,所以这可能是一个愚蠢的问题...

我想说if text1.get() == "1" then x = 0if text2.get() = "2" then y = 8。然后我想要一个添加xybutton

from tkinter import *

new = Tk()
new.title("Lockdown?")
new.geometry("700x400")

text3=Entry(new, width = "60")
text3.place(rely=0.15)
if text3.get() == "":
        label9 = Label(new, text="required field", fg="red")
        label9.place(rely=0.17)
elif text3.get() == "1":
        x = "0"
elif text3.get() == "2":
        x = "1"
elif text3.get() == "10":
        x = "9"
else:
        label10 = Label(new, text = "Please use a number ranging from 1-10")
 
text4=Entry(new, width = "60")
text4.place(rely=0.26)
if text4.get() == "":
        label11 = Label(new, text="Required Field", fg = "red")
        label11.place(rely=0.19)
elif text4.get() == "7":
        y = "3"
elif text4.get() == "8":
        y = "2"
elif text4.get() == "9":
        y = "1"
elif text4.get() == "10":
        y = "0"
else:
        label11 = Label(new, text = "Please use a number ranging from 1-10")
      
def cmd3():
        label15 = Label(new, text = x + y)
        label15.place(rely=0.8)
        
btn3 = Button(new, text = "Submit Answers", command = cmd3, font=("Arial Bold", 25), bg = "white", fg = "black")
btn3.place(rely=0.71)   
new.mainloop()

【问题讨论】:

  • 所有对某事做出反应的代码都应该放在按下按钮时调用的函数中 - 当没有任何内容输入任何文本条目时,所有当前代码都将被执行 - 你可能会想再做一些 TK 教程 ....
  • 至于 NameError:您使用的变量在您使用它的时候是未知的。谷歌错误,很多例子。 edit您的问题,如果您无法自行解决,请添加错误的堆栈跟踪 - 堆栈跟踪应该清楚地告诉您错误发生的位置。
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • GUI 框架(其他语言的 tkinter、PyQt、wxPython 等)不像 input() 那样工作。 Entry 不会等待您的数据 - 它只会通知 mainloop 它必须在窗口中显示的内容。而mainloop 开始一切 - 它显示窗口等。如果你想从Entry 获取价值,那么你应该在分配给Button 的函数中进行。

标签: python if-statement user-interface tkinter nameerror


【解决方案1】:

GUI 框架(tkinterPyQtwxPython 等以及其他语言)不像函数 input() 那样工作。 Entry 不会等待您的数据 - 它只会通知 mainloop 它必须在 window 中显示的内容。而mainloop 开始一切 - 它显示窗口等。如果你想从Entry 获取价值,那么你应该在分配给Button 的函数中进行。


我的版本有其他变化

我使用pack() 而不是place(),因为它更易于组织小部件。

我在开始时创建所有标签(带有空文本),然后我替换标签中的文本。

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def cmd3():
    # default value at start
    x = None
    y = None
    
    # remove previous text
    label1['text'] = ""
    label2['text'] = ""
    
    text = text1.get()
    
    if text == "":
        label1['text'] = "required field"
    elif text == "1":
        x = 0
    elif text == "2":
        x = 1
    elif text == "10":
        x = 9
    else:
        label1['text'] = "Please use a number ranging from 1-10"

    text = text2.get()
     
    if text == "":
        label2['text'] = "required field"
    elif text == "7":
        y = 3
    elif text == "8":
        y = 2
    elif text == "9":
        y = 1
    elif text == "10":
        y = 0
    else:
        label2['text'] = "Please use a number ranging from 1-10"
        
    print(x, y)

    # it can't be `if x and y:` because `0` will gives `False`
    if (x is not None) and (y is not None):
        label_result['text'] = str(x + y)

# --- main ---

new = tk.Tk()

# empty at start
label1 = tk.Label(new, text="", fg="red")
label1.pack()

text1 = tk.Entry(new, width="60")  # PEP8: arguments without spaces around `=`
text1.pack()

# empty at start
label2 = tk.Label(new, text="", fg="red")
label2.pack()

text2 = tk.Entry(new, width="60")  
text2.pack()
        
btn3 = tk.Button(new, text="Submit Answers", command=cmd3)
btn3.pack()   

# empty at start
label_result = tk.Label(new, text="", fg="green")
label_result.pack()

new.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多