[Anfängerfrage] Import btn vs from tkinter import *

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drace
User
Beiträge: 1
Registriert: Dienstag 29. Juni 2021, 10:50

Hallo liebe community,

Die Frage ist sicher sehr trivial, und wurde sicher so ähnlich schon mal gestelt, aber wenn ich nach import suche, bekomme ich ein paar 10k Ergebnisse...
Ich versuche mich erst seit ein paar Tagen an Python. Habe sonst so gut wie keine Programiererfahrung. Daher bitte ich um Nachsicht. :oops:

Ich spiele etwas mit tkinter rum und möchte mir eine GUI bauen. Dazu habe ich mir eine Klasse Button gebaut und diese Btn genannt. Mein File heist main.py

Code: Alles auswählen

from tkinter import *

mainframe = Tk()
mainframe.title('Test Fenstername')

scx=mainframe.winfo_screenwidth()/2
scy=mainframe.winfo_screenheight()/2

mainframe.configure(bg="black")
mainframe.geometry("+%d+%d" % (scx, scy))


class Btn:
    def __init__(self, master):
        myFrame=Frame(master)
        myFrame.pack()

        self.myButton=Button(master, text="Button1", command=self.aktion1)
        self.myButton.pack(pady=20)

    def aktion1(self):
        mainframe.destroy()



btn1 = Btn(mainframe)
mainframe.mainloop()
Das funktioniert auch soweit. Nun erstelle ich eine btn.py und will den Teil (class Btn:) "auslagern"...
Was nun passiert verstele ich nicht...

Meine main.py

Code: Alles auswählen

from tkinter import *
import btn


mainframe = Tk()
mainframe.title('Test Fenstername')

scx=mainframe.winfo_screenwidth()/2
scy=mainframe.winfo_screenheight()/2

mainframe.configure(bg="black")
mainframe.geometry("+%d+%d" % (scx, scy))


btn1 = btn.Btn(mainframe)
mainframe.mainloop()
Meine btn.py sieht so aus

Code: Alles auswählen

from tkinter import *


class Btn:
    def __init__(self, master):
        myFrame=Frame(master)
        myFrame.pack()

        self.myButton=Button(master, text="Button1", command=self.aktion1)
        self.myButton.pack(pady=20)

    def aktion1(self):
        mainframe.destroy()


def main():

    def aktion():
        mainframe.destroy()

    print('bitte main.py aufrufen um Programm zu starten')
    mainframe = Tk()

    scx=mainframe.winfo_screenwidth()/2
    scy=mainframe.winfo_screenheight()/2

    mainframe.title('wrong file called')
    mainframe.configure(bg="black")
    mainframe.geometry("+%d+%d" % (scx, scy))

    lbl = Label(mainframe, text='please start main.py to run the program', bg="black", fg="gray", font=("Arial", 20))
    lbl.pack(padx=30, pady=20)
    btn = Button(mainframe, text="CLOSE", bg="black", fg="gray", font=("Arial", 20), command=aktion)
    btn.pack(pady=30)

    mainframe.mainloop()


if __name__ == '__main__':
    main()
Nun meine Fragen.
Ich verstehe einfach nicht, was der Unterschied ist zwischen:

Code: Alles auswählen

from fibo import fib
from fibo import *

und

import fibo
versuche ich...

Code: Alles auswählen

from tkinter import *
from btn import *
wird mir "from tkinter import * "ausgegraut" und ich bekomme Fehlermeldungen.
einzig so funktioniert es

Code: Alles auswählen

from tkinter import *
import btn
Zweitens funktioniert das ganze nur solage bis ich auf den Button drücke. Dann bekomme ich Fehlemeldungen:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\python3\Lib\tkinter\__init__.py", line 1948, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\drace\PycharmProjects\00_IMS\btn.py", line 15, in aktion1
    mainframe.destroy()
    ^^^^^^^^^
NameError: name 'mainframe' is not defined

Ich danke euch vorab, für eure Zeit und Mühe.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@drace: Wenn Du keine Programmiererfahrung hast, dann willst Du hier gerade wirklich *alles* auf einmal verwenden, was man besser der Reihe nach lernen sollte, weil die Themen aufeinander aufbauen. GUI setzt objektorientierte Programmierung (OOP) voraus, OOP setzt Funktionen voraus, also echte, ohne irgendwelche globalen Variablen.

Und ich sehe hier auch keinen Grund das auf meherere Module aufzuteilen. Das macht das nur komplexer ohne einen Mehrwert zu bieten.

Ganz allgemein: Keine globalen Variablen und keine *-Importe. Und bei Namen keine kryptischen Abkürzungen und kein nummerierten Namen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten