ユーザーに入力を求めるポップアップメッセージボックスを作成します。このメソッドはクラス内にあります。私のコードは Java2sによるこのガイド に基づいています。
_class MyDialog:
def __init__(self, parent):
top = self.top = Toplevel(parent)
Label(top, text="Value").pack()
self.e = Entry(top)
self.e.pack(padx=5)
b = Button(top, text="OK", command=self.ok)
b.pack(pady=5)
def ok(self):
print "value is", self.e.get()
self.top.destroy()
root = Tk()
d = MyDialog(root)
root.wait_window(d.top)
_
しかし、これではtop = self.top = Toplevel(parent)
は機能しません。
私が達成しようとしていることのモックアップがあります。
私のプログラム構造は次のようになります:
_class MainUI:
def__int__(self):
...
self.initUI()
def initUI(self):
.......
Popup = Button(self, text="Enter Value", command=self.showPopup)
def showPopup(self):
#create the popup with an Entry here
_
Python)にメッセージボックスを作成して、ユーザー入力を受け入れるにはどうすればよいですか?
2つの異なるコードブロックについて少し混乱しています。コードの最初のブロックに対処するだけでは、メインループに入ることがないため、何も起こりません。そのためには、root.mainloop()
を呼び出す必要があります。これを行う一般的な方法は、ルートウィジェットにボタンを追加し、コールバック関数をボタン(d=MyDialog()
およびroot.wait_window(d.top)
を含む)にバインドすることです。
ここに、私があなたが望むことをすることを望んでいるいくつかの基本的なコードがあります...
from Tkinter import *
import sys
class popupWindow(object):
def __init__(self,master):
top=self.top=Toplevel(master)
self.l=Label(top,text="Hello World")
self.l.pack()
self.e=Entry(top)
self.e.pack()
self.b=Button(top,text='Ok',command=self.cleanup)
self.b.pack()
def cleanup(self):
self.value=self.e.get()
self.top.destroy()
class mainWindow(object):
def __init__(self,master):
self.master=master
self.b=Button(master,text="click me!",command=self.popup)
self.b.pack()
self.b2=Button(master,text="print value",command=lambda: sys.stdout.write(self.entryValue()+'\n'))
self.b2.pack()
def popup(self):
self.w=popupWindow(self.master)
self.b["state"] = "disabled"
self.master.wait_window(self.w.top)
self.b["state"] = "normal"
def entryValue(self):
return self.w.value
if __name__ == "__main__":
root=Tk()
m=mainWindow(root)
root.mainloop()
私はpopupWindowから値を取得し、それをメインプログラムで使用します(b2に関連付けられたラムダ関数を見てください)。
メインウィンドウ:
「クリックしてください」ウィンドウ:
「クリックしてください」が開いている間のメインウィンドウ: