【问题标题】:Tkinter getting data from an entry box and sending it to other functionsTkinter 从输入框获取数据并将其发送到其他函数
【发布时间】:2016-01-11 18:45:15
【问题描述】:

(Python 3.3) 在没有正式指导的情况下,我正在尝试将我对 Python 的基本知识提升到 Tkinter。下面是我正在尝试编写的程序。我有两个问题:

1 - 当我运行它时,两个单选按钮都处于活动状态,直到我单击一个。没什么大不了的,但它让我很烦。

2 - 我似乎无法使用 .get() 方法将输入框中输入的数据从 data_window 函数拉到 check_data 函数。正如我的程序所逃避的那样,它通过检查数据函数后的下一步是将其发送到尚未编写的 formatEntry 函数。但在我弄清楚这个问题之前,这显然也行不通。

我有一个不使用 TKinter 的功能版本,我正在尝试将这些知识应用到其中以用于学习。因此,请随时指出您看到的任何其他问题,请保持对新手非常基本的解释!谢谢

from tkinter import *
import os, shelve

food_entry = None

# Opens a new window for entering food items
def data_window():
    global food_entry
    new_window_entry = Tk()
    new_window_entry.title('Data Entry Window')
    Label(new_window_entry, text = 'Enter the food items you have eaten below, separated by commas:').grid(sticky = W, columnspan = 2)
    Label(new_window_entry, text = '(i.e. Apple, Eggs, Ground Beef)').grid(sticky = W, columnspan = 2)
    food_entry = Text(new_window_entry, width = 55, height = 2, wrap = WORD)
    food_entry.grid(sticky = W, columnspan = 2)
    #food_entry = Entry(new_window_entry)
    Label(new_window_entry, text = 'Within two hours after eating, did you experience any of the following symptoms:').grid(sticky = W, columnspan = 2)
    Label(new_window_entry, justify = LEFT, wraplength = 450, text = 'bloating, diarrhea, nausea, vomiting, irritable bowel, skin rashes, fatigue, joint pain, dark circles under the eyes, night sweats, or tingling or swelling of the face, fingers, feet or other extemities?').grid(sticky = W, columnspan = 2)
    inflam = StringVar(master = new_window_entry)
    Radiobutton(new_window_entry, text = 'Yes', variable = inflam, value = 'y').grid(row = 9, column = 0, sticky = E)
    Radiobutton(new_window_entry, text = 'No', variable = inflam, value = 'n').grid(row = 9, column = 1, sticky = W)
    Button(new_window_entry, text = 'Submit', command = check_data).grid(row = 10, column = 0, sticky = W + E)
    Button(new_window_entry, text = 'Cancel', command = new_window_entry.destroy).grid(row = 10, column = 1, sticky = W + E)
    #Check to ensure all fields have been entered
    #Convert entry into formatted list
    new_window_entry.mainloop()



def check_data():
    global food_entry
    print(food_entry.get(1.0, END))
    if food_entry.get(1.0, END) == None:
       print('Nothing Entered')
#    tkMessageBox.showwarning(message = 'Please complete all fields of the form.')
    else:
        print('Next Function')
#    formatEntry()
root = Tk()
root.title('')

Label(root, text = 'Food Tracker v3.0').grid(columnspan = 2)
Button(root, text = 'Enter Data', command = data_window).grid(row = 1, column = 0, sticky = W)
Button(root, text = 'View Data', command = view_window).grid(row = 1, column = 1, sticky = E)

【问题讨论】:

    标签: python tkinter get


    【解决方案1】:

    首先你定义了两次food_entry,第二次你从来没有对它做任何事情(food_entry = Entry(new_window_entry))。您需要删除第二个定义。

    接下来,这会将grid() 返回的内容分配给food_entry,即None

    food_entry = Text(new_window_entry, width = 55, height = 2, wrap = WORD).grid(sticky = W, columnspan = 2)
    

    因此,您需要在单独的行上 grid()。这将使 Text() 对象按照您的意图分配给 food_entry

    food_entry = Text(new_window_entry, width = 55, height = 2, wrap = WORD)
    food_entry.grid(sticky = W, columnspan = 2)
    

    最后,当使用get() 访问Text() 时,您需要指定您尝试获取的起点和终点:

    ...
    print(food_entry.get(1.0, END))
    if food_entry.get(1.0, END) == None:
    ....
    

    编辑:关于Radiobutton() 显示为最初选择的问题的最后一件事,您可以通过明确声明masterStringVar() 来纠正此问题:

    inflam = StringVar(master = new_window_entry)
    

    编辑 2:如果您的 if / else 语句不起作用:

    if food_entry.get(1.0, END) == None:   
    

    这是检查Text中的字符串是否为None,不是,它实际上是一个空字符串,所以我们需要相应地检查它:

    if food_entry.get(1.0, END).strip() == '':   # Use .strip() to remove spaces and newlines
    

    这是一个完整的代码示例:

    from tkinter import *
    import os, shelve
    
    food_entry = None
    
    # Opens a new window for entering food items
    def data_window():
        global food_entry
        new_window_entry = Toplevel()   # Change to Toplevel (a popup) instead of a new Tk instance
        new_window_entry.title('Data Entry Window')
        Label(new_window_entry, text = 'Enter the food items you have eaten below, separated by commas:').grid(sticky = W, columnspan = 2)
        Label(new_window_entry, text = '(i.e. Apple, Eggs, Ground Beef)').grid(sticky = W, columnspan = 2)
        food_entry = Text(new_window_entry, width = 55, height = 2, wrap = WORD)
        food_entry.grid(sticky = W, columnspan = 2)
        Label(new_window_entry, text = 'Within two hours after eating, did you experience any of the following symptoms:').grid(sticky = W, columnspan = 2)
        Label(new_window_entry, justify = LEFT, wraplength = 450, text = 'bloating, diarrhea, nausea, vomiting, irritable bowel, skin rashes, fatigue, joint pain, dark circles under the eyes, night sweats, or tingling or swelling of the face, fingers, feet or other extemities?').grid(sticky = W, columnspan = 2)
        Radiobutton(new_window_entry, text = 'Yes', variable = inflam, value = 'y').grid(row = 9, column = 0, sticky = E)
        Radiobutton(new_window_entry, text = 'No', variable = inflam, value = 'n').grid(row = 9, column = 1, sticky = W)
        Button(new_window_entry, text = 'Submit', command = check_data).grid(row = 10, column = 0, sticky = W + E)
        Button(new_window_entry, text = 'Cancel', command = new_window_entry.destroy).grid(row = 10, column = 1, sticky = W + E)
        #new_window_entry.mainloop()   No need for this, the mainloop is already running
    
    def check_data():
        global food_entry
        print(food_entry.get(1.0, END))
        if food_entry.get(1.0, END).strip() == '':
           print('Nothing Entered')
        else:
            print('Next Function')
    
    root = Tk()
    inflam = StringVar()  # move inflam init to a broader scope so that the buttons don't but
    inflam.set('n')    # initialize it as 'n'
    root.title('')
    
    Label(root, text = 'Food Tracker v3.0').grid(columnspan = 2)
    Button(root, text = 'Enter Data', command = data_window).grid(row = 1, column = 0, sticky = W)
    #Button(root, text = 'View Data', command = view_window).grid(row = 1, column = 1, sticky = E)
    root.mainloop()
    

    【讨论】:

    • 感谢您的回复。我按照上述进行了更正,并且发生了以下情况:文本框中的文本现在被正确拉到下一个函数,但是 if / else 语句不起作用,(之前也没有),并且单选按钮问题仍未解决。另外,我非常感谢您的解释。我已经能够跟随他们,除了声明主人,我将在接下来阅读。
    • 用你的新代码编辑你原来的问题,我来看看。
    • 谢谢!这就是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2021-07-01
    • 2020-09-22
    相关资源
    最近更新 更多