Seite 1 von 1

'NoneType' object zwei Anwendungsfenster kommunizieren

Verfasst: Donnerstag 26. November 2015, 22:58
von Pixilated
Weiss vielleicht jemand Rat wie ich es schaffe über zwei Funktionen und zwei Anwendungsfenster wie im Beispiel beschrieben zu kommunizieren. Erhalte leider keinen Zugriff auf die Listbox .
Über Hilfe bin ich sehr dankbar !

Code: Alles auswählen

import Tkinter


def main():
   
    main = Tk()
    global er3
    er3  = Listbox(main).grid (row =1, column = 2)

def test():
    test = Tk()
    er3.insert(END,"TEST")

main()

Re: 'NoneType' object zwei Anwendungsfenster kommunizieren

Verfasst: Donnerstag 26. November 2015, 23:06
von BlackJack
@Pixilated: Das ist sicher kein Quelltext den Du mal laufen lassen hast, denn das würde zu einem `NameError` führen weil `Tk` nirgends definiert ist.

Das nächste Problem ist ``global`` und das Du das über Funktionen lösen möchtest → Saubere GUI-Programmierung ist objektorientiert und ``global`` hat da nichts zu suchen. Also arbeite die Grundlagen bis einschliesslich Klassen durch bevor Du mit GUI-Programmierung weiter machst oder anfängst.

Das `Tk`-Exemplar ist zudem *das* *Haupt*fenster. Davon darf es immer nur eines geben. Sonst passieren komische Sachen bis hin zu Programmabstürzen. Weitere Fenster werden mit `Toplevel` erstellt.

`er3` (sehr schlechter Name!) wird an den Wert `None` gebunden und nicht an ein `Listbox`-Exemplar weil `None` der Rückgabewert von dem `grid()`-Aufruf ist.

Re: 'NoneType' object zwei Anwendungsfenster kommunizieren

Verfasst: Freitag 27. November 2015, 12:35
von Alfons Mittelmeyer
Tipp: mach eine Klasse, dann kannst Du auch aufrufen, was nachher definiert ist und brauchst kein global

Nenne die root nicht main, wenn Du sie root nennst, weiss jeder, was es ist.

Das ist ganz falsch: er3 = Listbox(main).grid (row =1, column = 2)
'Listbox' liefert ein Referenz auf das Widget. Listbox().grid() aber nicht. Also 2 Zeilen machen, wenn Du die Referenz brauchst.

Und wieder ganz falsch: 2 mal Tk(). Du hast nur ein tkinter und dafür gibt es nur ein Tk() und ein Hauptfenster. Andere Fenster mit Toplevel machen. So könnte dann der Code aussehen. Bei Deinem Code konnte gar nichts funktionieren, denn mit 'import Tkinter' allein funktioniert nicht mal Tk() und auch nicht Listbox(). Das hätte funktioniert mit 'from Tkinter import *'. Doch Sternchenimporte sollte man vermeiden.

Und dann war auch kein mainloop drin!
Was soll ein Beispiel, von dem Null funktionieren kann?

Das würde funktionieren:

Code: Alles auswählen

import tkinter as tk
 
class Main:
   
    def __init__(self):

        self.root = tk.Tk()
        self.root.title('Application')
        self.er3  = tk.Listbox(self.root)
        self.er3.grid (row =1, column = 2)
        self.test()
        self.root.mainloop()
 
    def test(self):
        test = tk.Toplevel(self.root)
        test.title('Toplevel')
        self.er3.insert('end',"TEST")
 
Main()

Re: 'NoneType' object zwei Anwendungsfenster kommunizieren

Verfasst: Freitag 27. November 2015, 13:11
von Alfons Mittelmeyer
Außerdem ist die ganze Fragestellung unsinnig. Denn was hat das mit Kommunikation von zwei Fenstern zu tun? Überhaupt nichts! Der Code mal ohne Klasse:

Code: Alles auswählen

import tkinter as tk
 
root = tk.Tk()
root.title('Application')
er3  = tk.Listbox(root)
er3.grid (row =1, column = 2)
 
# What for?
test = tk.Toplevel(root)
test.title('Toplevel')

er3.insert('end',"TEST")

root.mainloop()