2012-04-04 38 views
7

Tôi muốn tạo hộp thông báo bật lên nhắc người dùng nhập thông tin nhập. Tôi có phương pháp này bên trong một lớp học. Tôi đang căn cứ mã của tôi trên this guide by java2s.Tạo hộp thông báo bật lên với trường Nhập

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) 

Nhưng trong này, top = self.top = Toplevel(parent) không hoạt động đối với tôi.

Tôi có một mockup về những gì tôi đang cố gắng hoàn thành.

GUI mockup

cấu trúc chương trình của tôi trông giống như sau:

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 

Làm thế nào tôi có thể tạo ra một hộp thông báo bằng Python mà chấp nhận đầu vào sử dụng?

+0

Khi bạn nói "gửi e ntered dữ liệu trở lại hình thức chính "những gì bạn có nghĩa là gì? Dữ liệu này có được hiển thị trong tiện ích không? –

+0

Bằng cách gửi dữ liệu trở lại, tôi có nghĩa là giá trị là hộp văn bản được lưu trữ trong một biến mà tôi thao tác sau này trong chương trình. – Bharat

Trả lời

11

Tôi hơi bối rối về hai khối mã khác nhau của bạn. Chỉ cần giải quyết khối mã đầu tiên, không có gì xảy ra bởi vì bạn không bao giờ nhập vào vòng lặp chính. Để làm điều đó, bạn cần gọi số root.mainloop(). Cách thông thường để làm điều này là thêm một nút để phụ tùng gốc và ràng buộc một chức năng gọi lại cho Button (trong đó bao gồm d=MyDialog()root.wait_window(d.top))

Dưới đây là một số mã cơ bản mà tôi hy vọng làm những gì bạn muốn ...

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

Tôi nhận giá trị từ cửa sổ bật lênWindow và sử dụng nó trong chương trình chính (hãy xem hàm lambda được liên kết với b2).

cửa sổ chính:

Main window

"Click me" cửa sổ:

click me window

cửa sổ chính trong khi "click tôi" mở cửa:

Main window with greyed out "click me"

+0

Tôi đã thử mã của bạn. Bây giờ làm thế nào để vượt qua giá trị được nhập trong mục nhập đó trong biểu mẫu xuất hiện trở lại lớp 'mainWindow'? Có lẽ tôi có phương thức 'def getVal (self): \t \t trả về self.e' trên lớp' popupWindow' Làm cách nào để gọi điều này từ lớp 'mainWindow'? – Bharat

+0

@mgilson, đây là những gì tôi chính xác muốn làm. Tôi có chút bối rối về cách lấy giá trị từ lớp khác. Tôi đã suy nghĩ về Java và tôi giả định các biến lớp là riêng tư (biến 'giá trị' trong lớp popupWindow). Bây giờ tôi hiểu .. Phương thức 'entryValue()' làm những gì tôi muốn làm. Cảm ơn bạn! – Bharat

+0

Có lý do nào để sử dụng 'top = self.top = Toplevel (master)' trên 'self.top = Toplevel (master)'? –

Các vấn đề liên quan