15

ユーザーに入力を促すポップアップ メッセージ ボックスを作成したいと考えています。クラス内にこのメソッドがあります。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)はうまくいきません。

私は達成しようとしていることのモックアップを持っています。

GUI モックアップ

私のプログラム構造は次のようになります。

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で作成するにはどうすればよいですか?

4

4 に答える 4

25

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 に関連付けられたラムダ関数を見てください)。

メインウィンドウ:

メインウィンドウ

「クリックしてください」ウィンドウ:

ウィンドウをクリックしてください

「クリックしてください」が開いているときのメイン ウィンドウ:

グレーアウトしたメインウィンドウ

于 2012-04-05T00:41:18.763 に答える