Python 我在Tkinter上运行的代码有什么问题?

Python 我在Tkinter上运行的代码有什么问题?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我是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

我是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()
从tkinter导入*
def conv1(自我):
0英镑=174000000英镑
帆船0=340000872
无病0=14
knuts0=7
厨房1=浮子(厨房0+镰刀0/17+knuts0/29/17)
断开=浮动(0英镑/加仑1)
convert1=顶级(根)
兑换1.所有权(“英镑兑换加伦、镰刀和克努特兑换器”)
label1_1=Label(convert1,text=“键入您希望转换为加伦、镰刀和克努特的英镑金额,然后按Enter键。”)
label1_2=标签(convert1,text=“1帆船=5.12 GBP”)
label1_3=标签(convert1,text='GBP:')
标签1_1.pack()
标签1_2.pack()
标签1_3.pack()
usergbpvar=DoubleVar()
usergbp=Entry(convert1,textvariable=usergbpvar)
usergbp.pack()
a=float(usergbpvar.get()/fracture)
加伦=int(a//1)
a=(a%1)*17
镰刀=整数(a//1)
a=(a%1)*29
如果(a%1)==0.5:
K螺母=整数(圆形(a,0))
K+=1
其他:
K螺母=整数(圆形(a,0))
加伦,镰刀,克努特=str(加伦),str(镰刀),str(克努特)
label1_4=标签(convert1,text=galleons)
label1_5=标签(convert1,文本=镰刀)
label1_6=标签(转换器1,文本=螺母)
标签1_4.pack()
标签1_5.pack()
标签1_6.pack()
convert1.mainloop()
root=Tk()
btn1=按钮(根,文本='GBP到加伦、镰刀和克努特',背景='555',前景='ccc',字体='16')
btn1.pack()
btn1.bind(“”,conv1)
root.mainloop()
它应该从输入的数字中计算出三个数字,并将它们显示在屏幕上。但是,当我运行程序时,按下按钮后,我看到所有的数字都已经存在,它们是0。在我输入号码后,没有任何更改


您能告诉我代码中的问题在哪里吗?

我想您忘记绑定
返回键了
您应该在方法中添加
convert1.bind(“,*您的函数*)

“您的函数”是更改数字的函数。

问题/问题1:

当我运行程序时,按下按钮后,我看到所有 数字已经存在,它们是0

当你打电话的时候
label1\u 4=标签(convert1,text=galleons)
label1_4.pack()
这会告诉tkinter立即显示具有给定值的标签,例如,对于label1_4,Gallens为0(对于其他标签相同)。这不是问题,因为输入框的值应该是0

问题2:

在我输入号码后,没有任何更改

实际上,您不会告诉程序更新标签的值。正如TornaxO7所说,您需要绑定enter(return)键来调用函数
usergbp.bind(“,这里是计算函数)

我已经编辑了您的代码,以提供一种面向对象的方法。我建议您在前进的过程中探索这种方法,可能需要多个窗口

从tkinter导入*
类gui_窗口:
定义初始(自我,主):
#安装图形用户界面
self.master=master
self.master.wait_visibility()#尝试修复回溯错误,请参阅下面的问题/问题3
self.master.grab_set()#停止按钮1创建另一个gui_窗口实例
船长头衔(“加伦号、镰刀号和克努特号转换器英镑”)
self.label1_1=Label(master,text=“键入要转换为加伦、镰刀和克努特的英镑金额,然后按Enter。”)
self.label1_1.pack()
self.label1_2=标签(master,text=“1 Galleon=5.12 GBP”)
self.label1_2.pack()
self.label1_3=标签(主标签,text='GBP:')
self.label1_3.pack()
self.usergbpvar=DoubleVar()
self.usergbp=Entry(master,textvariable=self.usergbvar)
self.usergbp.bind(“,self.calculate)#当用户按enter键时,调用转换函数
self.usergbp.pack()
label1_4_1=Label(self.master,text='Galleons:').pack(anchor='w')
self.label1\u 4=标签(self.master,text='0',anchor='e')
self.label1_4.pack()
label1_5_1=Label(self.master,text='Sickles:').pack(anchor='w')
self.label1_5=标签(self.master,text='0',anchor='e')
self.label1_5.pack()
label1_6_1=Label(self.master,text='Knuts:').pack(anchor='w')
self.label1_6=标签(self.master,text='0')
self.label1_6.pack()
自我评估:0英镑=174000000
自航母0=34000872
自身疾病0=14
self.knuts0=7
self.galleons1=浮动(self.galleons0+self.sickeles0/17+self.knuts0/29/17)
self.fracture=float(self.gbp0/self.galleons1)
def计算(自身、事件):
#计算
a=float(self.usergbpvar.get()/self.fracture)
加伦=int(a//1)
a=a%1
a=a*17
镰刀=整数(a//1)
a=a%1
a=a*29
如果%1==0.5:
K螺母=整数(圆形(a,0))
K螺母=K螺母+1
其他:
K螺母=整数(圆形(a,0))
加伦=str(加伦)
镰刀=str(镰刀)
knuts=str(knuts)
#更新标签以反映计算结果
self.label1_4.config(text=galleons)
self.label1_5.config(文本=镰刀)
self.label1_6.config(text=knuts)
def创建图形用户界面(自我):
#创建gui_窗口顶级实例
convert1=顶级()
gui_窗口(转换1)
root=Tk()
btn1=按钮(根,文本='GBP到加伦、镰刀和克努特',背景='555',前景='ccc',字体='16')
btn1.pack()
btn1.bind(“”,创建gui)#调用函数生成下一个窗口
root.mainloop()
评论中的问题/问题3: 我相信错误:
tkinter.TclError:grab失败:窗口不可见
取决于您的操作系统。我无法在Mac OS上重现该错误,但添加了
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()