2013-04-20 2 views
25

मैं एक कार्यक्रम लिख रहा हूँ जो करना चाहिए:एकाधिक खिड़कियों के लिए टिंकर उदाहरण कोड, बटन सही तरीके से लोड क्यों नहीं होंगे?

  1. खुला एक बटन के प्रेस के साथ एक खिड़की।
  2. किसी अन्य बटन के प्रेस के साथ नई खुली विंडो बंद करें।

मैं कक्षाओं का उपयोग कर रहा हूं इसलिए मैं बाद में एक बड़े कार्यक्रम में कोड डाल सकता हूं। हालांकि, मैं अपने बटन सही तरीके से लोड नहीं कर सकता।

import tkinter as tk 

class Demo1(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self) 
     self.pack() 
     self.master.title("Demo 1") 
     self.button1 = tk.Button(self, text = "Button 1", width = 25, 
           command = self.new_window) 
     self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S) 

    def new_window(self): 
     self.newWindow = Demo2() 

class Demo2(tk.Frame): 
    def __init__(self): 
     new = tk.Frame.__init__(self) 
     new = tk.Toplevel(self) 
     new.title("Demo 2") 
     new.button = tk.Button(text = "Button 2", width = 25, 
           command = self.close_window) 
     new.button.pack() 

    def close_window(self): 
     self.destroy() 

def main(): 
    Demo1().mainloop() 

if __name__ == '__main__': 
    main() 

उत्तर

33

मैं एक और अधिक संगठित, बेहतर अभ्यास तरीके से अपने कोड दुबारा लिखा:

import tkinter as tk 

class Demo1: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window) 
     self.button1.pack() 
     self.frame.pack() 

    def new_window(self): 
     self.newWindow = tk.Toplevel(self.master) 
     self.app = Demo2(self.newWindow) 

class Demo2: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows) 
     self.quitButton.pack() 
     self.frame.pack() 

    def close_windows(self): 
     self.master.destroy() 

def main(): 
    root = tk.Tk() 
    app = Demo1(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

परिणाम:

Demo1 windowDemo2 window

+0

@ADB यह निर्भर करता है। आम तौर पर, दो 'Tkloop()' s को दो 'Tk()' विंडो पर चलाया जाता है। हालांकि, अगर आप कई खिड़कियां चाहते हैं, तो दो 'mainloop() 'से बचना संभव है। इस प्रकार, आप 'Toplevel()' विजेट का उपयोग कर सकते हैं जो 'Tk() 'के समान है। –

+7

दो मेनलोप्स किसी भी चीज़ पर "निर्भर" नहीं होते हैं और यह सिर्फ "नीचे नहीं देखा जाता" है, यह गलत है। आपको केवल एक की जरूरत है। मेनलोप पर एक कॉल एक अनंत लूप है, जब आप एक से अधिक रन करते हैं तो आपके पास अनंत लूप के अंदर एक अनंत लूप होता है। आपको अपने कोड (डेमो 1.न्यू_विंडो में) में 'मेनलोप' पर दूसरी कॉल को हटा देना चाहिए, अन्यथा यह उन लोगों को भ्रमित कर देगा जो टिंकर का उपयोग कैसे करें सीखने की कोशिश कर रहे हैं। –

+0

क्या आप 'close_windows()' को समझा सकते हैं? इसे कब कहा जाना चाहिए? – sbhatla

9

आपको दूसरे बटन के लिए मास्टर निर्दिष्ट करने की आवश्यकता है। अन्यथा यह पहली खिड़की पर पैक हो जाएगा। यह न केवल Button के लिए आवश्यक है, बल्कि अन्य विगेट्स और गैर-गुई ऑब्जेक्ट्स जैसे कि StringVar के लिए भी आवश्यक है।

त्वरित सुधार: Demo2 में अपने Button करने के लिए पहले तर्क के रूप में फ्रेम new जोड़ने

संभवतः बेहतर: वर्तमान में आप Demo2tk.Frame से इनहेरिट है, लेकिन मैं इस अधिक समझ में आता है अगर तुम Demo2 बदलने कुछ इस तरह होना करने के लिए लगता है,

class Demo2(tk.Toplevel):  
    def __init__(self): 
     tk.Toplevel.__init__(self) 
     self.title("Demo 2") 
     self.button = tk.Button(self, text="Button 2", # specified self as master 
           width=25, command=self.close_window) 
     self.button.pack() 

    def close_window(self): 
     self.destroy() 

बस एक सुझाव के रूप में, आप केवल tkinter आयात करना चाहिए एक बार। अपने पहले दो आयात विवरणों में से एक चुनें।

2
#!/usr/bin/env python 
import Tkinter as tk 

from Tkinter import * 

class windowclass(): 

     def __init__(self,master): 
       self.master = master 
       self.frame = tk.Frame(master) 
       self.lbl = Label(master , text = "Label") 
       self.lbl.pack() 
       self.btn = Button(master , text = "Button" , command = self.command) 
       self.btn.pack() 
       self.frame.pack() 

     def command(self): 
       print 'Button is pressed!' 

       self.newWindow = tk.Toplevel(self.master) 
       self.app = windowclass1(self.newWindow) 

class windowclass1(): 

     def __init__(self , master): 
       self.master = master 
       self.frame = tk.Frame(master) 
       master.title("a") 
       self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25 , command = self.close_window) 
       self.quitButton.pack() 
       self.frame.pack() 


     def close_window(self): 
       self.master.destroy() 


root = Tk() 

root.title("window") 

root.geometry("350x50") 

cls = windowclass(root) 

root.mainloop() 
संबंधित मुद्दे