Невозможно получить ввод от GUI - PullRequest
0 голосов
/ 05 августа 2020

Я в основном делаю программу, которая вычисляет периметр и площадь определенной формы. Для этого я использую tkinter GUI.

В любом случае, я решил, что хочу, чтобы пользователь выделил контрольную кнопку, когда они закончат ввод своих чисел, чтобы я знал, когда собирать данные из виджет ввода в tkinter, но кажется, что моя контрольная кнопка не работает.

def perTriangle(): #PerTriangle means the perimeter of a triangle. 
    tk.Label(window, text = "Enter in the Numbers: ", background = "white").place(x = 1115, y = 100)
    tk.Label(window, text = "Side 1: ", background = "white").place(x = 1115, y = 130)
    entry1 = tk.Entry(window)
    entry1.place(x = 1155, y = 130)
    tk.Label(window, text = "Side 2: ", background = "white").place(x = 1115, y = 160)
    entry2 = tk.Entry(window)
    entry2.place(x = 1155, y = 160)
    tk.Label(window, text = "Side 3: ", background = "white").place(x = 1115, y = 190)
    entry3 = tk.Entry(window)
    entry3.place(x = 1155, y = 190)
    check1 = tk.IntVar()
    cButton = tk.Checkbutton(window, text = "Enter: ", variable = check1)
    cButton.place(x = 1115, y = 220)
    if check1.get() == 1:
        num1 = float(entry1.get())
        num2 = float(entry2.get())
        num3 = float(entry3.get())
        ans = num1 + num2 + num3
        tk.messagebox.showinfo("Your Answer is: ", str(ans))

После того, как контрольная кнопка отключена, ничего не запускается. Я не знаю, что я здесь делаю не так, потому что я думаю, что все работает, но это все равно не работает. Я не получаю никаких синтаксических ошибок с этой программой.

Затем я попытался использовать несколько функций, чтобы посмотреть, поможет ли это:

def perTriangle():
    tk.Label(window, text = "Enter in the Numbers: ", background = "white").place(x = 1115, y = 100)
    tk.Label(window, text = "Side 1: ", background = "white").place(x = 1115, y = 130)
    entry1 = tk.Entry(window)
    entry1.place(x = 1155, y = 130)
    tk.Label(window, text = "Side 2: ", background = "white").place(x = 1115, y = 160)
    entry2 = tk.Entry(window)
    entry2.place(x = 1155, y = 160)
    tk.Label(window, text = "Side 3: ", background = "white").place(x = 1115, y = 190)
    entry3 = tk.Entry(window)
    entry3.place(x = 1155, y = 190)
    check1 = tk.IntVar()
    cButton = tk.Checkbutton(window, text = "Enter: ", variable = check1)
    cButton.place(x = 1115, y = 220)
    isUserDone(check1)


def isUserDone(x):
    if x.get() == 1:
        calculationPTriangle()


def calculationPTriangle():
    num1 = float(entry1.get())
    num2 = float(entry2.get())
    num3 = float(entry3.get())
    ans = num1 + num2 + num3
    tk.messagebox.showinfo("Your Answer is: ", str(ans))

И снова я получил тот же результат. Что я могу сделать, чтобы решить эту проблему? Я ценю любую помощь! Заранее спасибо!

Обновленный код после первоначального редактирования:

def perTriangle():
    tk.Label(window, text = "Enter in the Numbers: ", background = "white").place(x = 1115, y = 100)
    tk.Label(window, text = "Side 1: ", background = "white").place(x = 1115, y = 130)
    entry1 = tk.Entry(window)
    entry1.place(x = 1155, y = 130)
    tk.Label(window, text = "Side 2: ", background = "white").place(x = 1115, y = 160)
    entry2 = tk.Entry(window)
    entry2.place(x = 1155, y = 160)
    tk.Label(window, text = "Side 3: ", background = "white").place(x = 1115, y = 190)
    entry3 = tk.Entry(window)
    entry3.place(x = 1155, y = 190)
    check1 = tk.IntVar()
    cButton = tk.Checkbutton(window, text = "Enter: ", variable = check1, command = calculationPTriangle)
    cButton.place(x = 1115, y = 220)

def calculationPTriangle():
    num1 = float(entry1.get())
    num2 = float(entry2.get())
    num3 = float(entry3.get())
    ans = num1 + num2 + num3
    tk.messagebox.showinfo("Your Answer is: ", str(ans))

1 Ответ

2 голосов
/ 05 августа 2020

Ваша проблема в том, что GUI не работает, как input(), и виджеты не ждут ваших данных, и вы проверяете значения в виджете даже до того, как tkinter отображает окно. Или до того, как вы сможете поместить данные в виджеты.

Обычно мы используем Button для запуска кода после того, как мы помещаем код в виджеты, и тогда у него есть шанс получить эти значения.

Button имеет command=function_name для назначения функции, которая будет запускаться при нажатии кнопки.

BTW: command= требуется имя функции без ()

import tkinter as tk
        
# --- functions ---

def on_click():
    print('Entry:', entry.get())
    print('Checkbox:', checkbox_var.get())

# --- main ---

root = tk.Tk()

label = tk.Label(root, text='Input')
label.pack()

entry = tk.Entry(root)
entry.pack()

checkbox_var = tk.IntVar()
checkbox = tk.Checkbutton(root, text="Enter", variable=checkbox_var)
checkbox.pack()

button = tk.Button(root, text='OK', command=on_click)
button.pack()

root.mainloop()   

Checkbutton также имеет command= для запуска функции при изменении выбора. Но он будет выполнен, когда вы его выберете, но также и когда вы отмените выбор.

import tkinter as tk
        
# --- functions ---

def on_change():
    print('Entry:', entry.get())
    print('Checkbox:', checkbox_var.get())

# --- main ---

root = tk.Tk()

label = tk.Label(root, text='Input')
label.pack()

entry = tk.Entry(root)
entry.pack()

checkbox_var = tk.IntVar()
checkbox = tk.Checkbutton(root, text="Enter: ", variable=checkbox_var, command=on_change)
checkbox.pack()

root.mainloop()   

РЕДАКТИРОВАТЬ: Версия с global

import tkinter as tk
        
# --- functions ---

def on_change():
    print('Entry:', entry.get())
    print('Checkbox:', checkbox_var.get())

def main():
    #global root   # if I would need `root` in other function
    #global label  # if I would need `label` in other function
    global entry
    global checkbox_var
    
    root = tk.Tk()
    
    label = tk.Label(root, text='Input')
    label.pack()
    
    entry = tk.Entry(root)
    entry.pack()
    
    checkbox_var = tk.IntVar()
    checkbox = tk.Checkbutton(root, text="Enter: ", variable=checkbox_var, command=on_change)
    checkbox.pack()
    
    root.mainloop()
    
# --- main ---

main()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...