2

基本的に同じことを行うため、コードのスニペットのみを投稿します。

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 *.それは冗長であり、このコードには必要ありません.

4

3 に答える 3

1

この GUI モジュール (ほとんどすべてのモジュールと同様) はイベント駆動型であることを覚えておく必要があります。つまり、何らかのイベント (ボタンのクリックなど) が発生するたびに関数が呼び出され、これはすべて Tkinter のメインループによって行われます。

あなたの場合:定義コードを過ぎて(それtime_calc = Tk()以降)、ループを開始します。次に、ボタンクリックのイベントが発生すると、バインドされた関数( )の呼び出しにつながりますj2ghandler()。これから、アプリケーションはそれが戻るのを待ち、ループに戻ります。

解決

ボタンが押されたときに、ボタンの下にあるラベルのテキストを変更したいと思います(時間は変換されます)。

イベント呼び出し関数でラベルの値を設定する必要があります。ここで、印刷後:

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

注: コメント行は必要ありません。

オブジェクトを再作成する必要なく、ラベルが変更されLabelます。グローバルに関するAl.Salのヒントもここで重要です。リクエスト関数は状態を保存してはなりません。

Pythonで頑張ってください!

于 2013-08-07T20:18:50.993 に答える
0

global特にstringあいまいであるため、 を使用することから離れます。

return (または任意の新しい名前) をプログラムの一番下に置き、コードを に含めjd2gdます。例えば:stringj2ghandler

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

次に、最後の4行を削除します。

私はこれをテストしていないので、エラーが発生した場合、1 つの解決策はボタンを次のように変更することです。

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ます。

幸運を!

于 2013-08-07T20:12:27.160 に答える