我只会发布我的代码片段,因为基本上,它会做同样的事情。
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)
我知道,“片段”。当您输入数字并单击按钮时应该发生什么,并且确实会在后台更改字符串“string”。我不能让标签更新。我已经尝试过,使用StringVar()来更新标签。此外,我尝试在函数结束时执行.update()
,但它不起作用。
对此事的任何帮助将不胜感激。这是应用程序的唯一部分,无论我尝试什么,我都无法让它工作。
感谢您的帮助。
PS我没有包含所有from Tkinter import *
,这是多余的,而且对于此代码不是必需的。
答案 0 :(得分:1)
你需要记住,这个GUI模块(几乎所有)都是事件驱动的,这意味着只要发生某些事件(点击按钮等)就会调用函数,这都是由Tkinter的mainloop完成的。
在你的情况下:你的定义代码(所有那些time_calc = Tk()
和之后)开始循环;然后,当点击按钮的事件触发时,它会调用绑定函数(j2ghandler()
)。从现在开始,应用程序等待它返回,并返回其循环。
我假设您想要更改按钮下面的标签文本,当它被按下时(转换时间)。
您需要在事件调用函数中设置label的值;在这里,打印后:
def jd2gd(jd):
#global string
...
print string
var.set(string)
#return
注意:不需要注释行。
标签变更后无需重新创建Label
对象。
此处
祝你好运!
答案 1 :(得分: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 :(得分:0)
我会偏离使用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
个对象。