【问题标题】:Labels Aren't Changing标签没有改变
【发布时间】:2013-08-07 19:35:19
【问题描述】:

我只会发布我的代码的 sn-p,因为本质上,它做同样的事情。

string = ''

time_calc = Tk()
time_calc.geometry('500x400')
time_calc.title("Calculate A Time")
time_calc_frame= Frame(time_calc).grid(row=0, column=0)

jul_box = Entry(time_calc)
jul_box.insert(0, "Julian Date")
jul_box.pack(side = TOP)
jul_box.bind('<Return>')

def jd2gd(jd):
  global string
  jd=jd+0.5
  Z=int(jd)
  F=jd-Z
  alpha=int((Z-1867216.25)/36524.25)
  A=Z + 1 + alpha - int(alpha/4)

  B = A + 1524
  C = int( (B-122.1)/365.25)
  D = int( 365.25*C )
  E = int( (B-D)/30.6001 )

  dd = B - D - int(30.6001*E) + F

  if E<13.5:
            mm=E-1

  if E>13.5:
            mm=E-13

  if mm>2.5:
            yyyy=C-4716

  if mm<2.5:
            yyyy=C-4715

  months=["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
  daylist=[31,28,31,30,31,30,31,31,30,31,30,31]
  daylist2=[31,29,31,30,31,30,31,31,30,31,30,31]

  h=int((dd-int(dd))*24)
  min =int((((dd-int(dd))*24)-h)*60)
  sec=86400*(dd-int(dd))-h*3600-min*60

  # Now calculate the fractional year. Do we have a leap year?
  if (yyyy%4 != 0):
            days=daylist2
  elif (yyyy%400 == 0):
            days=daylist2
  elif (yyyy%100 == 0):
            days=daylist
  else:
            days=daylist2

  hh = 24.0*(dd % 1.0)
  min = 60.0*(hh % 1.0)
  sec = 60.0*(min % 1.0)

  dd =  dd-(dd%1.0)
  hh =  hh-(hh%1.0)
  min =  min-(min%1.0)

  if hh < 10:
    hh = '0%s'%str(int(hh))
  else:
      hh = int(hh)
  if min < 10:
    min = '0%s'%str(int(min))
  else:
      min = int(min)
  if sec < 10:
    sec = '0%s'%str(int(sec))
  else:
      sec = int(sec)

  string = "%s/%s/%s  %s:%s:%s UTC" % (str(int(mm)), str(int(dd)), str(yyyy), str(hh),               str(min), str(sec))
  print string
  return


def j2ghandler():
  jul = float(jul_box.get())

  jd2gd(jul)

j2g_button = Button(time_calc, text='Convert Julian\n to Gregorian', command = j2ghandler, width= 25, pady=5).pack(side=TOP)

#Draw Time String on Canvas
var = StringVar()
var.set(string)
label = Label(time_calc, textvariable=var)
label.pack(side=TOP)

我知道,“sn-p”。当您输入数字并单击按钮时应该发生什么,它应该并且确实在幕后更改字符串“string”。我无法让标签更新。如您所见,我尝试使用 StringVar() 来更新标签。另外,我尝试在函数结束时执行.update(),但没有成功。

对此事的任何帮助将不胜感激。这是应用程序的唯一部分,无论我尝试什么,我都无法让它工作。

感谢您的帮助。

PS 我没有包含所有 from Tkinter import *,它是多余的,对于这段代码来说不是必需的。

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    评论框里的部分是我改的:

    #####################
    from Tkinter import *
    #####################
    string = ''
    
    time_calc = Tk()
    time_calc.geometry('500x400')
    time_calc.title("Calculate A Time")
    time_calc_frame= Frame(time_calc).grid(row=0, column=0)
    
    jul_box = Entry(time_calc)
    jul_box.insert(0, "Julian Date")
    jul_box.pack(side = TOP)
    jul_box.bind('<Return>')
    
    def jd2gd(jd):
      global string
      jd=jd+0.5
      Z=int(jd)
      F=jd-Z
      alpha=int((Z-1867216.25)/36524.25)
      A=Z + 1 + alpha - int(alpha/4)
    
      B = A + 1524
      C = int( (B-122.1)/365.25)
      D = int( 365.25*C )
      E = int( (B-D)/30.6001 )
    
      dd = B - D - int(30.6001*E) + F
    
      if E<13.5:
                mm=E-1
    
      if E>13.5:
                mm=E-13
    
      if mm>2.5:
                yyyy=C-4716
    
      if mm<2.5:
                yyyy=C-4715
    
      months=["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
      daylist=[31,28,31,30,31,30,31,31,30,31,30,31]
      daylist2=[31,29,31,30,31,30,31,31,30,31,30,31]
    
      h=int((dd-int(dd))*24)
      min =int((((dd-int(dd))*24)-h)*60)
      sec=86400*(dd-int(dd))-h*3600-min*60
    
      # Now calculate the fractional year. Do we have a leap year?
      if (yyyy%4 != 0):
                days=daylist2
      elif (yyyy%400 == 0):
                days=daylist2
      elif (yyyy%100 == 0):
                days=daylist
      else:
                days=daylist2
    
      hh = 24.0*(dd % 1.0)
      min = 60.0*(hh % 1.0)
      sec = 60.0*(min % 1.0)
    
      dd =  dd-(dd%1.0)
      hh =  hh-(hh%1.0)
      min =  min-(min%1.0)
    
      if hh < 10:
        hh = '0%s'%str(int(hh))
      else:
          hh = int(hh)
      if min < 10:
        min = '0%s'%str(int(min))
      else:
          min = int(min)
      if sec < 10:
        sec = '0%s'%str(int(sec))
      else:
          sec = int(sec)
    
      string = "%s/%s/%s  %s:%s:%s UTC" % (str(int(mm)), str(int(dd)), str(yyyy), str(hh),               str(min), str(sec))
      print string
      ##############
      return string
      ##############
    
    
    def j2ghandler():
      jul = float(jul_box.get())
    
      #####################
      var.set(jd2gd(jul))
      #####################
    
    j2g_button = Button(time_calc, text='Convert Julian\n to Gregorian', command = j2ghandler, width= 25, pady=5).pack(side=TOP)
    
    #Draw Time String on Canvas
    var = StringVar()
    var.set(string)
    label = Label(time_calc, textvariable=var)
    label.pack(side=TOP)
    
    ##############################
    time_calc.mainloop()
    ##############################
    

    基本上,关键是让jd2gd 返回string,然后用它来更新标签变量。

    【讨论】:

      【解决方案2】:

      您需要记住,这个 GUI 模块(几乎所有模块)是事件驱动的,这意味着每当发生某些事件(单击按钮等)时都会调用函数,这都是由 Tkinter 的 mainloop 完成的。

      在您的情况下:通过您的定义代码(所有time_calc = Tk() 及以上)您开始循环;然后,当按钮单击事件触发时,它会导致调用绑定函数 (j2ghandler())。从现在开始,应用程序等待它返回,然后返回到它的循环。

      解决方案

      我假设您想更改按钮下方标签的文本,当它被按下时(时间被转换)。

      您需要在事件调用函数中设置标签的值;在这里,打印后:

      def jd2gd(jd):
          #global string
          ...
          print string
          var.set(string)
          #return
      

      注意:不需要注释的行。

      无需重新创建 Label 对象即可更改标签。 此外,关于全局变量的 Al.Sal 提示在这里也很重要。 请求函数不应该保存状态。

      祝 Python 好运!

      【讨论】:

        【解决方案3】:

        我会偏离使用global,尤其是string,因为它是模棱两可的。

        jd2gd 返回string(或您决定给它起的任何新名称)并在程序的底部包含j2ghandler 中的代码。例如:

        def j2ghandler():
            jul = float(jul_box.get())
            gregDate = jd2gd(jul)
            label = Label(time_calc, text=gregDate)
            label.pack(side=TOP)
        

        然后删除最后 4 行。

        我没有对此进行测试,所以如果出现错误,一种解决方案是将按钮更改为:

        j2g_button = Button(time_calc, text='Convert Julian\n to Gregorian', command=lambda: j2ghandler(time_calc), width= 25, pady=5)
        j2g_button.pack(side=TOP)
        

        j2ghandler 到:

        def j2ghandler(master):
            jul = float(jul_box.get())
            gregDate = jd2gd(jul)
            label = Label(master, text=gregDate)
            label.pack(side=TOP)
        

        顺便说一句... 您可能想要更改:

        j2g_button = Button(time_calc, text='Convert Julian\n to Gregorian', command = j2ghandler, width= 25, pady=5).pack(side=TOP)
        

        到:

        j2g_button = Button(time_calc, text='Convert Julian\n to Gregorian', command = j2ghandler, width= 25, pady=5)
        j2g_button.pack(side=TOP)
        

        它按原样工作,但如果您再次尝试使用j2g_button,它将返回一个none 对象。

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          • 2019-11-22
          • 1970-01-01
          • 2023-01-25
          • 2011-11-21
          • 1970-01-01
          相关资源
          最近更新 更多