'NoneType' object zwei Anwendungsfenster kommunizieren

Fragen zu Tkinter.
Antworten
Pixilated
User
Beiträge: 16
Registriert: Samstag 27. Juni 2015, 14:09

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()
Zuletzt geändert von Anonymous am Donnerstag 26. November 2015, 23:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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