int(variable.entry.get)在使用Tkinter时返回PY_VAR0

时间:2017-05-11 16:03:55

标签: python tkinter

我正在尝试用Tkinter编写一些代码。我目前正在尝试创建一个使用条目值(ttk.Entry)的变量,但每当我尝试将该值转换为整数时,该值就变为PY_VAR0。这是代码:

import tkinter
from tkinter import *
from tkinter import ttk
from fractions import Fraction
import time

def fracalculator():

def fracalculate():
        fracdec.set(int(numfrac.entry.get) / int(denfrac.entry.get()))
        fracper.set((int(numfrac.entry.get) / int(denfrac.entry.get()))*100)
        print(fracdec)
        print(fracper)
        ttk.Label(mainframe, text="Your results:").grid(column=1, row=7, sticky=W)
        ttk.Label(mainframe, textvariable=numfrac).grid(column=1, row=9, sticky=W)
        ttk.Label(mainframe, text="/").grid(column=1, row=9)
        ttk.Label(mainframe, textvariable=denfrac).grid(column=1, row=9, sticky=E)
        ttk.Label(mainframe, text="=").grid(column=2, row=9, sticky=W)
        ttk.Label(mainframe, textvariable=fracdec).grid(column=2, row=9)
        ttk.Label(mainframe, text="=").grid(column=2, row=9, sticky=E)
        ttk.Label(mainframe, textvariable=fracper).grid(column=3, row=9)


numfrac = IntVar()
denfrac = IntVar()
null = StringVar()
null2 = StringVar()
null3 = StringVar()
root.withdraw()
fracalc = tkinter.Tk()
fracalc.title("SuperCalculator")
mainframe = ttk.Frame(fracalc, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
ttk.Label(mainframe, text="Numerator (Top)").grid(column=1, row=1, sticky=(W))
ttk.Label(mainframe, text="Denominator (Bottom)").grid(column=1, row=3, sticky=(W))
ttk.Label(mainframe, textvariable=null).grid(column=2, row=2)
ttk.Label(mainframe, textvariable=null2).grid(column=2, row=4)
ttk.Label(mainframe, textvariable=null3).grid(column=2, row=6)
numfrac.entry = ttk.Entry(mainframe, width=20, textvariable=numfrac)
numfrac.entry.grid(column=3, row=1, sticky=(E))
denfrac.entry = ttk.Entry(mainframe, width=20, textvariable=denfrac)
denfrac.entry.grid(column=3, row=3, sticky=(E))
ttk.Button(mainframe, text="Calculate!", command=fracalculate).grid(column=2, row=5)


root = tkinter.Tk()
root.title("SuperCalculator")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

fracdec = StringVar()
fracper = StringVar()

ttk.Label(mainframe, text="Welcome to SuperCalculator!").grid(column=2, row=1, sticky=(W, E))
ttk.Button(mainframe, text="Start with a Fraction", 
command=fracalculator).grid(column=1, row=3)

root.mainloop()

1 个答案:

答案 0 :(得分:0)

我看到了一些事情。

  1. def fracalculator():内部没有任何内容,因此其余代码可能会抛出错误。我只是将pass放在其中以测试您的代码。

  2. 您需要将root = tkinter.Tk()移到顶部的某个位置。它不应该超过任何引用root的内容,在你的情况下它前面有root.withdraw(),这会导致错误。

  3. 也许我不明白你使用的原因:

  4. fracdec.set(int(numfrac.entry.get) / int(denfrac.entry.get())) fracper.set((int(numfrac.entry.get) / int(denfrac.entry.get()))*100)

    但我会用:

    fracdec = int(numfracentry.get()) / int(denfracentry.get())
    fracper = int(numfracentry.get()) / (int(denfracentry.get())*100)
    
    1. 至于PY_VAR0的事情。我相信它是参考tkinter.intVar对象。您应该使用.get()来获取intVar对象的值。
    2. 尝试使用此代替

      import tkinter
      from tkinter import *
      from tkinter import ttk
      from fractions import Fraction
      import time
      
      root = tkinter.Tk()
      root.title("SuperCalculator")
      
      def fracalculator():
          pass
      
      def fracalculate():
          fracdec = int(numfrac.entry.get()) / int(denfrac.entry.get())
          fracper = int(numfrac.entry.get()) / (int(denfrac.entry.get())*100)
          print(fracdec)
          print(fracper)
          ttk.Label(mainframe, text="Your results:").grid(column=1, row=7, sticky=W)
          ttk.Label(mainframe, textvariable=numfrac).grid(column=1, row=9, sticky=W)
          ttk.Label(mainframe, text="/").grid(column=1, row=9)
          ttk.Label(mainframe, textvariable=denfrac).grid(column=1, row=9, sticky=E)
          ttk.Label(mainframe, text="=").grid(column=2, row=9, sticky=W)
          ttk.Label(mainframe, textvariable=fracdec).grid(column=2, row=9)
          ttk.Label(mainframe, text="=").grid(column=2, row=9, sticky=E)
          ttk.Label(mainframe, textvariable=fracper).grid(column=3, row=9)
      
      numfrac = IntVar()
      denfrac = IntVar()
      null = StringVar()
      null2 = StringVar()
      null3 = StringVar()
      root.withdraw()
      fracalc = tkinter.Tk()
      fracalc.title("SuperCalculator")
      mainframe = ttk.Frame(fracalc, padding="3 3 12 12")
      mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
      mainframe.columnconfigure(0, weight=1)
      mainframe.rowconfigure(0, weight=1)
      ttk.Label(mainframe, text="Numerator (Top)").grid(column=1, row=1, sticky=(W))
      ttk.Label(mainframe, text="Denominator (Bottom)").grid(column=1, row=3, sticky=(W))
      ttk.Label(mainframe, textvariable=null).grid(column=2, row=2)
      ttk.Label(mainframe, textvariable=null2).grid(column=2, row=4)
      ttk.Label(mainframe, textvariable=null3).grid(column=2, row=6)
      numfrac.entry = ttk.Entry(mainframe, width=20, textvariable=numfrac)
      numfrac.entry.grid(column=3, row=1, sticky=(E))
      denfrac.entry = ttk.Entry(mainframe, width=20, textvariable=denfrac)
      denfrac.entry.grid(column=3, row=3, sticky=(E))
      ttk.Button(mainframe, text="Calculate!", command=fracalculate).grid(column=2, row=5)
      
      mainframe = ttk.Frame(root, padding="3 3 12 12")
      mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
      mainframe.columnconfigure(0, weight=1)
      mainframe.rowconfigure(0, weight=1)
      
      fracdec = StringVar()
      fracper = StringVar()
      
      ttk.Label(mainframe, text="Welcome to SuperCalculator!").grid(column=2, row=1, sticky=(W, E))
      ttk.Button(mainframe, text="Start with a Fraction", 
      command=fracalculator).grid(column=1, row=3)
      
      root.mainloop()