Fenster nur einmal aufrufen und Zugriff von außen auf Funktionen

Fragen zu Tkinter.
EtR
User
Beiträge: 6
Registriert: Montag 11. Dezember 2017, 22:41

Fenster nur einmal aufrufen und Zugriff von außen auf Funktionen

Beitragvon EtR » Dienstag 12. Dezember 2017, 17:17

Hallo,

ich bin Anfänger in Python und habe 2 Probleme mit meinem Programm:
1. Wenn ich mehrfach auf den Button "zeige Fenster" drücke entstehen logischerweise mehrere "fenster1". Das möchte ich aber nicht haben. Es soll trotz mehrfachen Aufrufs nur eine Instanz entstehen, die dann mit dem Button "lösche Fenster" mit einem Klick geschlossen wird.

2. Ich möchte in einer anderen Funktion außerhalb von "fenster()" Signale abfragen und dann je nach Signal z.B. die Funktionen up() und down() ansteuern, um so an unterschiedliche Wert in der Listbox heranzukommen. Aber durch Funktionen außerhalb von "fenster()" kann ich ja nicht auf die inneren Funktionen (up(), down()) zugreifen. Ich habe nicht den geringsten Ansatz, wonach ich in Google suchen soll, um das Problem zu lösen.

Danke und Gruß
EtR

  1. import tkinter as tk
  2.  
  3. def fenster():
  4.     def down():
  5.         global aktive
  6.         fenster1.see(aktive+1)
  7.         aktive = (fenster1.curselection()[0])+1
  8.         if aktive > (fenster1.size()-3): aktive = (fenster1.size()-3) # die letzten beiden Zeilen werden ausgeblendet
  9.         fenster1.select_set(aktive)
  10.         fenster1.select_clear(aktive-1)
  11.     def up():
  12.         global aktive
  13.         fenster1.see(aktive-2)
  14.         aktive = (fenster1.curselection()[0])-1
  15.         if aktive < 1 : aktive = 1
  16.         fenster1.select_set(aktive)
  17.         fenster1.select_clear(aktive+1)
  18.     def ende():
  19.         b_up.destroy()
  20.         b_down.destroy()
  21.         fenster1.destroy()
  22.         b_ende.destroy()
  23.    
  24.     b_ende = tk.Button(root, text='lösche Fenster', width=80, command=ende)
  25.     b_ende.place(x = 95, y = 5, width=80, height=20)
  26.     b_up = tk.Button(root, text='up', width=80, command=up)
  27.     b_up.place(x = 195, y = 5, width=80, height=20)
  28.     b_down = tk.Button(root, text='down', width=80, command=down)
  29.     b_down.place(x = 295, y = 5, width=80, height=20)
  30.    
  31.    
  32.     fenster1 = tk.Listbox(root,selectmode='browse',height=15, width=100)
  33.     fenster1.config(bg='lightgreen', font=('times', 10, 'italic'))
  34.     fenster1.place(x = 30, y = 40, width=80, height=200)
  35.     for i in range(0,10):
  36.         fenster1.insert('end',str(i))
  37.     fenster1.select_set(aktive)
  38.     fenster1.see(aktive-2)
  39.  
  40. root = tk.Tk()
  41. root.title("Test")
  42. root.geometry("800x600")
  43. root["bg"] = "Black"
  44. aktive = 4
  45. button1 = tk.Button(root, text='zeige Fenster', width=80, command=fenster)
  46. button1.place(x = 5, y = 5, width=80, height=20)
  47.  
  48. root.mainloop()
  49.  
Sirius3
User
Beiträge: 7039
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Fenster nur einmal aufrufen und Zugriff von außen auf Funktionen

Beitragvon Sirius3 » Dienstag 12. Dezember 2017, 18:20

@EtR: für GUI-Programmierung braucht man Objektorientierung. Vergiss dass es global gibt, oder dass man Funktionen in Funktionen definieren kann. Das Hauptfenster muß eine Klasse sein, und für fenster1 brauchst Du eine zweite. Dann mußt Du Dir im Hauptfenster nur merken, ob das fenster1 offen ist oder nicht. Vergiß auch, dass es `place` gibt. Damit kann man keine OBerflächen machen, die unter unterschiedlichen Systemen mit unterschiedlichen Auflösungen gut aussehen oder gar benutzbar sind (wie bei mir zum Beispiel).

  1. import tkinter as tk
  2.  
  3. class Fenster(tk.Frame):
  4.     def __init__(self, parent):
  5.         super().__init__(parent)
  6.         self.active = 4
  7.         tk.Button(self, text='up', command=self.move_up).grid(row=1, column=1)
  8.         tk.Button(self, text='down', command=self.move_down).grid(row=1, column=2)
  9.         self.listbox = tk.Listbox(self, selectmode='browse',
  10.             bg='lightgreen', font=('times', 10, 'italic'))
  11.         self.listbox.grid(row=2, column=1)
  12.         for i in range(0,10):
  13.             self.listbox.insert('end', i)
  14.         self.listbox.select_set(self.active)
  15.         self.listbox.see(self.active-2)
  16.  
  17.     def move_down(self):
  18.         self.listbox.see(self.active + 1)
  19.         self.active = min(self.listbox.curselection()[0] + 1, self.listbox.size() - 3)
  20.         self.listbox.select_set(self.active)
  21.         self.listbox.select_clear(self.active-1)
  22.  
  23.     def move_up(self):
  24.         self.listbox.see(self.active - 2)
  25.         self.active = max(self.listbox.curselection()[0] - 1, 1)
  26.         self.listbox.select_set(self.active)
  27.         self.listbox.select_clear(self.active+1)
  28.    
  29. class MainWin(tk.Tk):
  30.     def __init__(self):
  31.         super().__init__()
  32.         self.title("Test")
  33.         self.fenster = None
  34.         self.button = tk.Button(self, text='zeige Fenster', command=self.show_fenster)
  35.         self.button.grid(row=1, column=1)
  36.  
  37.     def show_fenster(self):
  38.         if self.fenster is None:
  39.             self.button['text'] = 'lösche Fenster'
  40.             self.fenster = Fenster(self)
  41.             self.fenster.grid(row=2, column=1)
  42.         else:
  43.             self.button['text'] = 'zeige Fenster'
  44.             self.fenster.destroy()
  45.             self.fenster = None
  46.  
  47. def main():
  48.     root = MainWin()
  49.     root.mainloop()
  50.  
  51. if __name__ == '__main__':
  52.     main()
EtR
User
Beiträge: 6
Registriert: Montag 11. Dezember 2017, 22:41

Re: Fenster nur einmal aufrufen und Zugriff von außen auf Funktionen

Beitragvon EtR » Dienstag 12. Dezember 2017, 19:55

Hallo Sirius3 ,
danke für Deine schnelle Antwort!!! Dieser Weg wird wohl zu meinen Ziel führen.
Vor der objektorientierten Programmierung habe ich mich bisher gefürchtet. Aber was muss, das muss!!!
Hast Du vielleicht einen guten Linke auf ein Tutorial für objektorientierten Programmierung :K

Gruß EtR

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder