• 締切済み

Pythonコードの間違いを指摘して

import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") a() label=tk.Label(root,text=i) label.grid() tk.mainloop() →できた import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") label=tk.Label(root,text=i) label.grid() button=tk.Button(root,text="button",command=a) button.grid() tk.mainloop() →できない(0と表示される)

  • Python
  • 回答数2
  • ありがとう数0

みんなの回答

  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.2

label=tk.Label(root,text=i)の直前にprint(i)を追加して、iの値を確認してみてください。iの値が0のときにlabel=tk.Label(root,text=i)を実行したら、ラベルの文字列として"0"が表示されるのは当然です。 もしかして、tk.Label(root,text=i)を一度実行したら、その後iの値が変化したときにラベルの文字列も連動して自動的に変化すると思っているでしょうか。tk.Label(root,text=i)にそのような機能はありません。

回答No.1

tk.TK() をtk.Tk()に置き換えてください。 あと、tk.Tk() のインスタンスを root として作成した後、root.mainloop() を呼び出してイベントループを開始したら良いかと。 変更後⤵︎ ︎ import tkinter as tk i = 0 def a(): global i i = 1 root = tk.Tk() root.geometry("100x100") label = tk.Label(root, text=i) label.grid() button = tk.Button(root, text="button", command=a) button.grid() root.mainloop()

関連するQ&A

  • Pythonコードの間違いを指摘して

    import tkinter as tk lastplay="" def gamestart(): global lastplay lastplay="試合開始" frame_main.tkraise() root=tk.Tk() frame_settings=tk.Frame(root) frame_settings.grid() button_gamestart=tk.Button(frame_settings,command=gamestart) button_gamestart.grid() fraim_main=tk.Frame(root) fraim_main.grid() label_1=tk.Label(frame_main,text=f"{lastplay}です") label_1.grid() fraim_settings.tkraise() root.mainloop() エラー内容 frame_mainが表示されたとき、変数の「試合開始」が表示されず、「です」のみ表示される。

  • PythonでGUIを組んでいたら・・・

    Pythonのプログラミングについて TkinterでGUIを組んでいるのですが、Buttonウィジェットに複数のコマンドを持たせることは可能ですか? 可能なら、そのやり方を教えてください。 たとえば、 button=Button(root,text="Push!!",command=lambda:label.destroy()) のときは1つしかコマンドは実行できませんが、どうにかして、コマンド「label2.destroy()」をやりたいときはどのように書けばいいのでしょうか?

  • 14行目がおかしい?

    いつもお世話になりありがとうございます。 下記プログラムにてタイトルの通り、メッセージが出ます。 どうおかしいのでしょうか? ご回答のほど宜しくお願い申し上げます。 from cgitb import text import tkinter window = tkinter.Tk() window.title('足し算') window.minsize(400,400) Entry1=tkinter.Entry(font=("ゴシック",20),width=5,bg='blue') Entry1.place(x=30,y=65) textplace=tkinter.Label(font=("ゴシック",20),text='+') textplace.place(x=120,y=65) Entry2=tkinter.Entry(font=("ゴシック",20),width=5,bg='blue') Entry2.place(x=160,y=65) text2=tkinter.Label(font=("ゴシック",20),text='=') text2.place(x=250,y=65) kotae_text=tkinter.Label(text"",font=("ゴシック",20)) kotae_text.place(x=300,y=65) button=tkinter.Button(text='結果は?',font=("ゴシック",20),bk='blue',activebackground="blue") button.place(x=150,y=150) def kekka(): suuji1=Entry1.get() suuji1=int(suuji1) suuji2=Entry2.get() suuji2=int(suuji2) kotae_text['text']=suuji1+suuji2 button['command']=kekka window.mainloop()

  • tkinterでボタンの幅をそろえたい

    お世話になります。 python 3.3.5とtkinterで勉強中です。 下記のようにtkinterでボタンを複数個横並びに配置したいのですがボタンの幅や高さを任意に設定する方法が解りません。 パッカーをつかっていて height=10 などとするとエラーになってしまいます。 import tkinter as tk def main(): w1=tk.Tk() # ボタンの幅をそろえる方法が解らない... btn1=tk.Button(w1, text=u"ボタン-1").pack(side=tk.LEFT, padx=5, pady=10) btn2=tk.Button(w1, text=u"ボタン--2").pack(side=tk.LEFT, padx=5, pady=10) btn3=tk.Button(w1, text=u"ボタン---3").pack(side=tk.LEFT, padx=5, pady=10) w1.mainloop() if __name__ == '__main__': main() どうしたらできるのでしょうか? よろしくお願いします。

  • python 絵をかいた後、inputを行いたい

    現在pythonの勉強を行っています。 Tkで線を引いた後、inputで指定した場所に絵をさらに追加したいのですが、 絵が描かれずに先にinputがでてしまってどうしたらよいか困っています。 下記のようなプログラムを今書いており(○×ゲームにしたい)、 どこを直したらよいかわかりません。 どうかご教授お願いします。 from Tkinter import * root = Tk() c0 = Canvas(root, width = 200, height = 200) c0.create_line(10, 70, 190, 70) c0.create_line(10, 130, 190, 130) c0.create_line(70, 10, 70, 190) c0.create_line(130, 10, 130, 190) c0.pack() for Y in range(9): a = input("どこに置く?: ") if Y%2==0: id = c0.create_oval(10+(60*a/3), 10+(60*a/3),70+(60*a/3) , 70+(60*a/3)) c0.pack() root.mainloop()

  • perl/tk のScrollbarとジオメトリー

    Tk::Tilerを教えてもらってスクロールバーを配置できたのですが、ジオメトリーマネージャでpack,gridを使って、配置できる方法を知りたいのですが。 ----------------------------------------------- use Tk; use Tk::Tiler; $top = MainWindow->new(); $top0 = $top->Tiler()->pack(); $top->AddScrollbars($top0); $top->configure(\'-scrollbars\' => \'w\'); #ボタン $button_1 = $top0->Button( -text => \"1\")->grid(); $button_2 = $top0->Button( -text => \"2\")->grid(); .... $button_6 = $top0->Button( -text => \"6\")->grid(); $button_11 = $top0->Button( -text => \"11\" ); $button_12 = $top0->Button( -text => \"12\" ); $button_13 = $top0->Button( -text => \"13\" ); ...... $button_16 = $top0->Button( -text => \"16\" ); $button_11->grid($button_12,....,$button_16); $button_21 = $top0->Button( -text => \"21\" ); $button_22 = $top0->Button( -text => \"22\" ); ........ $button_26 = $top0->Button( -text => \"26\" ); $button_21->grid($button_22,......,$button_26); $top0->Manage($button_1,$button_2,$button_3,$button_4,$button_5,$button_6); $top0->Manage($button_11,$button_12,$button_13,$button_14,$button_15,$button_16); $top0->Manage($button_21,$button_22,$button_23,$button_24,$button_25,$button_26); $top0->update; $top0->focus; MainLoop();

    • ベストアンサー
    • Perl
  • RubyTkのTkLabelが変わらない

    以下のコードが思うように動かないです。どのようにすればlabelchangedが表示されるでしょうか? require 'tk' class View def initialize Tk.root.title('test') @label = TkLabel.new('text' => "label").pack Tk.mainloop end def change(str) @label.text = str end end win = View.new win.change("labelchanged")

    • ベストアンサー
    • Ruby
  • Pythonでキーが押されたことを判定したい

    Python初心者です。Pythonでキー入力の値を変数keyとして取り出したいのですが、上手くいきません。 グローバル関数がわかっていないのかと思いますが直し方がわかりません。 最終的に37行目のprint(key)でkeyの値を取り出したいのですがどうすればよいですか。 # -*- coding: utf8 -*- import tkinter as tk import winsound root = tk.Tk() frame = tk.Canvas(root, width=800, height=600) pimg = tk.PhotoImage(file="wall.png") frame.place(x=0, y=0) frame.create_image(400, 300, image=pimg) imgA = tk.PhotoImage(file = 'pressed_A.png') imgB = tk.PhotoImage(file = 'Pressed_B.png') def keyA(event): global key key="A" frame.place(x=0, y=0) frame.create_image(320, 220, image=imgA, tag="illust") root.update() winsound.PlaySound("pressed_A.wav", winsound.SND_FILENAME) def keyB(event): global key key="B" frame.place(x=0, y=0) frame.create_image(320, 220, image=imgB, tag="illust") root.update() winsound.PlaySound("pressed_B.wav", winsound.SND_FILENAME) frame.bind("a", keyA) frame.focus_set() frame.pack() frame.bind("b", keyB) frame.focus_set() frame.pack() print(key) root.mainloop()

  • python __del__()に関して

    「Programming Python 4th Edition」(O'REILLY) P.466に 以下のコードを実行すると 本来tmp.set(5)で6番目のRadiobuttonが選択された状態で初回表示されるはずだが radio1()終了時にtmp.__del__()が呼ばれて tmpに保持されている値がunsetされることにより Radiobuttonの初回表示が狂う (global行のコメントアウトをやめると正しく動作するようになる) といったことが書いてあり、実際にコードを実行すると確かにそのようになるのですが tmp.__del__()が呼び出される理由が理解できません。 __del__()が呼び出されるのはオブジェクトへの参照がなくなった時であって tmpの値(IntVarオブジェクト)はRadiobuttonのコンストラクタに渡されており、Radiobuttonオブジェクト内部で参照され続けるので、__del__()が呼ばれることはないはずだ、と素人考えでは思えるのですが。 お分かりになる方が居らっしゃればどうか教えて下さい。 ------------------------------------------------------------ from tkinter import * root = Tk() def radio1(): >>>>#global tmp >>>>tmp = IntVar() >>>>for i in range(10): >>>>>>>>rad = Radiobutton(root, text=str(i), value=i, variable=tmp) >>>>>>>>rad.pack(side=LEFT) >>>>tmp.set(5) radio1() root.mainloop() (>>>>は空白に読み替えてください)

  • tkinterのコンボボックスとラベルの連携表示

    以下のサイトを参考に、Pythonのtkinterを用いて簡単なGUIを作成しています。 https://office54.net/python/tkinter/ttk-combobox-widget https://toolmania.info/post-12996/ 現在、コンボボックスとラベルの連携表示において、上手く想定通りの挙動を示さず困っております。 下記のコードにおいて、 「combobox」の値(クリックして選択)を変更した際に、 label1: list1を反映しているコンボボックスの文字列をそのまま反映、 label2: label1用のウィジェット変数(strvalue_widget)の文字列をlist1から検索して要素番号(インデックス)を取得し、更にlist2から同じ要素番号の数値を反映 という表示を行いたく考えているのですが、 実際にコンボボックスをクリックした際、label2の表示が空白となってしまう状態です。 しかし、確認のためにlabel2用のウィジェット変数(floatvalue_widget)を出力してみる(25行目)と、クリック毎に適切な値が出力されます。 (ウィジェット変数としては正しく認識されているにもかかわらず、表示だけが適切にされないという不可解な状況になっています。) 色々と試行錯誤してみましたが、label2は空白もしくはデフォルト値(0.1)から変わらないだけで、 どうしてもきちんと連動した動きを見せてくれませんでした。 お手数をお掛けして申し訳ありませんが、どなたかお詳しい方がおられましたら、 是非教えていただけますと助かります。 よろしくお願いします。 【以下、問題としているサンプルコード】 import tkinter as tk from tkinter import ttk list1 = ["No.1", "No.2", "No.3", "No.4", "No.5"] list2 = [0.1, 0.2, 0.3, 0.4, 0.5] #rootメインウィンドウの設定 root = tk.Tk() #メインフレームの作成と設置 frame = ttk.Frame(root) frame.grid(column=0, row=0, sticky=tk.NSEW, padx=5, pady=10) strvalue_widget = tk.StringVar(value=list1[0]) floatvalue_widget = tk.DoubleVar(value=list2[0]) label1 = ttk.Label(frame, textvariable=strvalue_widget) label2 = ttk.Label(frame, textvariable=floatvalue_widget) combobox = ttk.Combobox(frame, textvariable=strvalue_widget, values=list1) def combobox_clicked(event): global floatvalue_widget floatvalue_widget = float(list2[list1.index(combobox.get())]) print(f"確認 floatvalue_widget: {floatvalue_widget}") return combobox.bind("<<ComboboxSelected>>", combobox_clicked) #レイアウト label1.grid(row=0, column=0) label2.grid(row=0, column=1) combobox.grid(row=0, column=2) #GUIウィンドウを常駐表示 root.mainloop()

専門家に質問してみよう