我是Python Tkinter的新手,我想创建一个在其上运行的程序。但是,我的代码无法正常工作。
from tkinter import *
def conv1(self):
gbp0 = 174000000
galleons0 = 34000872
sickles0 = 14
knuts0 = 7
galleons1 = float(galleons0 + sickles0 / 17 + knuts0 / 29 / 17)
fracture = float(gbp0 / galleons1)
convert1 = Toplevel(root)
convert1.title("Pounds Sterling (GBP) to Galleons, Sickles and Knuts Converter")
label1_1 = Label(convert1, text="Type the amount of money in GBP that you would like to convert to Galleons, Sickles and Knuts and press Enter.")
label1_2 = Label(convert1, text="1 Galleon = 5.12 GBP")
label1_3 = Label(convert1, text='GBP:')
label1_1.pack()
label1_2.pack()
label1_3.pack()
usergbpvar = DoubleVar()
usergbp = Entry(convert1, textvariable=usergbpvar)
usergbp.pack()
a = float(usergbpvar.get() / fracture)
galleons = int(a // 1)
a = (a % 1) * 17
sickles = int(a // 1)
a = (a % 1) * 29
if (a % 1) == 0.5:
knuts = int(round(a, 0))
knuts += 1
else:
knuts = int(round(a, 0))
galleons, sickles, knuts = str(galleons), str(sickles), str(knuts)
label1_4 = Label(convert1, text=galleons)
label1_5 = Label(convert1, text=sickles)
label1_6 = Label(convert1, text=knuts)
label1_4.pack()
label1_5.pack()
label1_6.pack()
convert1.mainloop()
root = Tk()
btn1 = Button(root, text='GBP to Galleons, Sickles and Knuts', bg='#555', fg='#ccc', font='16')
btn1.pack()
btn1.bind('<Button-1>', conv1)
root.mainloop()
应该从输入的数字中计算出三个数字,并将其显示在屏幕上。但是,当我运行该程序时,按下按钮后,我看到所有数字都已经存在并且它们都是0。输入我的数字后,什么都没有改变。
能否请您告诉我代码中的问题在哪里?
答案 0 :(得分:2)
问题/问题1:
当我运行程序时,按下按钮后,我看到所有 数字已经在那里,它们是0。
致电时
label1_4=Label(convert1, text=galleons)
label1_4.pack()
这告诉tkinter立即以给定值显示标签,例如标签1_4的每加仑,为0(其他标签相同)。这不是问题,可以预期,因为输入框的值从0开始。
问题/问题2:
输入号码后,什么都没有改变。
您实际上并没有告诉程序曾经更新标签的值。正如TornaxO7所说,您需要绑定回车键才能调用函数usergbp.bind("<Return>", calculation_function_here)
我已经编辑了您的代码以提供一种面向对象的方法。我建议随着您的进步而探索这种方法,并且可能需要多个窗口。 Best way to structure a tkinter application?
from tkinter import *
class gui_window:
def __init__(self, master):
# setup gui
self.master = master
self.master.wait_visibility() # attempt to fix traceback error, see Problem/question 3 below
self.master.grab_set() # stops button1 creating another gui_window instance
self.master.title('Pounds Sterling (GBP) to Galleons, Sickles and Knuts Converter')
self.label1_1=Label(master, text="Type the amount of money in GBP that you would like to convert to Galleons, Sickles and Knuts and press Enter.")
self.label1_1.pack()
self.label1_2=Label(master, text="1 Galleon = 5.12 GBP")
self.label1_2.pack()
self.label1_3=Label(master, text='GBP:')
self.label1_3.pack()
self.usergbpvar=DoubleVar()
self.usergbp=Entry(master, textvariable=self.usergbpvar)
self.usergbp.bind("<Return>", self.calculate) # when user presses enter call the conversion function
self.usergbp.pack()
label1_4_1 = Label(self.master, text = 'Galleons:').pack(anchor = 'w')
self.label1_4=Label(self.master, text='0', anchor = 'e')
self.label1_4.pack()
label1_5_1 = Label(self.master, text = 'Sickles:').pack(anchor = 'w')
self.label1_5=Label(self.master, text='0', anchor = 'e')
self.label1_5.pack()
label1_6_1 = Label(self.master, text = 'Knuts:').pack(anchor = 'w')
self.label1_6=Label(self.master, text='0')
self.label1_6.pack()
self.gbp0=174000000
self.galleons0=34000872
self.sickles0=14
self.knuts0=7
self.galleons1=float(self.galleons0+self.sickles0/17+self.knuts0/29/17)
self.fracture=float(self.gbp0/self.galleons1)
def calculate(self, event):
# do calculation
a=float(self.usergbpvar.get()/self.fracture)
galleons=int(a//1)
a=a%1
a=a*17
sickles=int(a//1)
a=a%1
a=a*29
if a%1==0.5:
knuts=int(round(a, 0))
knuts=knuts+1
else:
knuts=int(round(a, 0))
galleons=str(galleons)
sickles=str(sickles)
knuts=str(knuts)
# update the labels to reflect the calculation
self.label1_4.config(text=galleons)
self.label1_5.config(text=sickles)
self.label1_6.config(text=knuts)
def create_gui(self):
# create a gui_window Toplevel instance
convert1=Toplevel()
gui_window(convert1)
root=Tk()
btn1=Button(root, text='GBP to Galleons, Sickles and Knuts', bg='#555', fg='#ccc', font='16')
btn1.pack()
btn1.bind('<Button-1>', create_gui) # call function to make next window
root.mainloop()
评论中的问题/问题3:
我相信错误:tkinter.TclError: grab failed: window not viewable
取决于您的操作系统。我无法在Mac OS上重现该错误,但是添加self.master.wait_visibility()
(已添加到我的代码中)可以解决此问题:
python tkinter treeview not allowing modal window with direct binding like on_rightclick
答案 1 :(得分:0)
我猜您忘记了绑定Return
键。
您应该在方法中添加convert1.bind("<Return>", *your function*)
。
“您的功能”是更改数字的功能。