• 締切済み

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

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

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

やりかたはいくつかあるでしょうが def labelDestroy():  label.destroy()  label2.destroy() button=Button(root,text="Push!!",command=labelDestroy)

関連するQ&A

  • 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コードの間違いを指摘して

    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のプログラミングです。

    【Pythonのプログラミング】 TkinterでGUIを組んでいるのですが、mathモジュールには、階乗計算がないようです。 式入力型電卓を作っているのですが、「3!」とうち込むと、「6」が出るようなものは、どのようにして作るのでしょうか? ちなみに、 http://www.geocities.jp/m_hiroi/light/pytk02.html を参考に作っています。

  • tkinterでコマンドラインっぽいGUI

    tkinterでコマンドラインっぽいGUI、つまり、ユーザーから一行だけ入力を受け付けて、入力に対応した処理をし、すでに入出力された行は編集できないというようなGUIを作ることは可能なのでしょうか? 色々考えたのですが、一行だけ入力を受け付けて、入力に対応した処理をし、すでに入出力された行は編集できないという処理をどうすればtkinterで実現できるのかわかりません。 OS:Windows7 version:python3.2

  • Pythonでプログラミングをしています

    Pythonでプログラミングをしています。 普段はTkinterを中心にいじっているのですが、 ふとおもったのですが、コマンドラインで、Enterキーを押したら処理1,次にEnterキーを押したら処理2....... みたいなことは、どのようにやるのでしょう? たとえば、「2の100乗を計算するとき、1乗から計算結果を、Enterキーを押すごとに表示していく」みたいなものです。

  • 「Python」コンピューター言語パイソンについて

    こんにちは。 Pythonやろうとインストールして早速はじめようかと思った時、 Pythonのフォルダの中に… IDLE (Python GUI) と Python (command line)という起動ファイルがありました。 後者のPython (command line)はコマンドプロントのようなインターフェイスをしていますが、 普通どちらを使うのでしょうか?? C++の時はVS、javaはeclipsを使っていたので…と言っても齧った程度ですけど、少し経ったらeclipsでpythonを使っていこうと思います。

  • 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()

  • PythonでSetWindowPosを使うにはどうしたら良いでしょうか?

    少し前から、Tkinterを使って居りウィンドウを常に最前面に表示したいと思い立ちwin32guiとwin32conと言うモジュールが必要で、インポートするところまで辿り着いたのは良いのですが、その後がよくわかりません。 実験的に from Tkinter import * import win32gui,win32con root = Tk() win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,0,0,200,150,win32con.SWP_SHOWWINDOW) root.mainloop() のようなコードを実行してみたのですが以下のようなエラーメッセージが帰ってきます。 Traceback (most recent call last): File "C:\Documents and Settings\PC USER\デスクトップ\Python\q2.py", line 9, in -toplevel- win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,1,1,100,50,win32con.SWP_SHOWWINDOW) AttributeError: Tk instance has no attribute '__int__' 引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。 私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。

  • 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()

  • GUIアプリでブロックする関数使う(スレッド化?)

    Python, Tkinterで以下のようなGUIアプリを作ろうとしています。 ・見た目はWindowsのメモ帳のような感じ ・メニューバーにある「受信開始」ボタンを押すと、特定のポート番号から  UDPで受信したメッセージを取得し、テキストエリアに延々と表示する  (テキストエリアとは、メモ帳で言えば、我々が書きたいテキストを書く部分です) ・普通のGUIアプリ通り、受信・表示中でも、×ボタンを押せば終了するし、  「受信停止」ボタンを押せば受信を停止するようにしたい。 ここで、UDPで受信する際の関数としてrecvfrom関数を使っているのですが、 この関数はメッセージがなにか届くまでブロッキングします。 この間、他の部分、つまり×ボタンだとか、他のボタンは押しても一切無反応になってしまいます。 具体的には、「受信開始」ボタンが押された際に呼ぶ関数として自作のrecvFromPort()という関数を読んでおり、それは以下のようにwhileで延々回すものです。 menubar.add_command(label = "受信開始", under = 0, command = lambda: recvFromPort(port.get())) def recvFromPort(myport): [tab] sock = socket(AF_INET, SOCK_DGRAM) [tab] sock.bind(("", myport)) [tab] while True: [tab][tab] data, addr = sock.recvfrom(BUFSIZE) [tab][tab] textarea.insert("end", data) これを、受信中でも他のボタンなどが聞くようにするには、 受信部分は別スレッドにすべきなのでしょうか? いろいろと調べては見たのですが、初歩的すぎるのか、ヒントがえられませんでした。 アドバイス頂きたく、よろしくお願い申し上げます。

専門家に質問してみよう