2016-01-11 138 views
0

(Python 3.3)没有正式的指令,我正试图将我非常基本的Python知识融入到Tkinter中。以下是我正在编写的一个程序。我有两个问题:Tkinter从输入框中获取数据并将其发送到其他函数

1 - 当我运行这个时,两个单选按钮都是激活的,直到我点击一个。不是一个大问题,但它让我很烦恼。

2 - 我似乎无法使用.get()方法将输入框中输入的数据从data_window函数拖动到check_data函数。当我的程序没有通过时,通过检查数据函数之后的下一步是将其发送到formatEntry函数,该函数尚未写入。但是,直到我认为这一点,这显然不会工作。

我有一个没有使用TKinter的功能版本,我试图将这些知识应用于学习目的。所以请随时指出你看到的任何其他问题,请保持对newb非常基本的解释!由于

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) 

回答

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()在单独一行。这样可以使分配给food_entry你想要的Text()对象:

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

最后,get()访问Text()当你需要specifiy起点和终点,你试图获取:

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

编辑:最后一件事要涵盖您最初选择的Radiobutton()显示的问题,您可以通过明确声明的master来更正此问题:

inflam = StringVar(master = new_window_entry) 

编辑2:对于你的if/else语句不工作:

if food_entry.get(1.0, END) == 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() 
+0

感谢响应。我如上所述进行了更正,并且发生了以下情况:正在将文本框中的文本正确地拉到下一个函数,但是if/else语句不起作用(它不在其中之前),并且单选按钮问题仍然没有解决。另外,我真的很感谢解释。除了声明主人外,我一直能够关注他们,我将在下面详细阅读。 – Gregory6106

+0

用你的新代码编辑你的原始问题,我会看看。 – Jkdc

+0

谢谢!这是解决方案。 – Gregory6106

相关问题