StringVar() und [Errno 10054]-Probleme

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
DMD-OL
User
Beiträge: 193
Registriert: Samstag 26. Dezember 2015, 16:21
Wohnort: Oldenburg (Oldenburg)

Montag 13. August 2018, 13:13

hi
ich benutze python 2.7.10 und habe zusätzlich PyScripter und PyCharm auf meinem rechner.
meine beiden fragen:
1):
wenn ich meinen code laufen lasse, werden mir alle label mit inhalt angezeigt. wenn ich dann aber auf Back und anschließend direkt
wieder auf Starten clicke, werden mir nur die label ohne textinhalt angezeigt.
kann mir jemand helfen, was da nicht stimmt?
und 2):
wenn ich den code in PyScripter starte und dann direkt wieder auf schließen clicke, gibt es einen fehler.
>>> Traceback (most recent call last):
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 196, in __call__
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 71, in syncreq
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 429, in sync_request
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 229, in _send_request
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 224, in _send
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\channel.py", line 69, in send
File "C:\Program Files (x86)\PyScripter\Lib\rpyc.zip\rpyc\core\stream.py", line 181, in write
EOFError: [Errno 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen

in PyCharm gibt es diesen fehler nicht.
wieso gibt es diesen fehler in PyScripter???

Mein Code lautet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import Tkinter
from Tkinter import RAISED, RIDGE, X, Y, LEFT, RIGHT, NW, VERTICAL, ALL, NSEW
import tkFileDialog
import os
import os.path
import time


class Tablewindow:

    liste = [['Hallo.txt', u'325315663', u'Wed Aug 08 15:15:42 2018', u'Nein']]

    def __init__(self, window):
        self.window = window
        self.straing = []
        self.window.geometry("%dx%d+%d+%d" % (800, 700, 350, 100))
        # Frame Table
        self.table = Tkinter.Frame(self.window, width=708, height=500, relief=RAISED, borderwidth=2)
        # Frame Bottom
        self.framebottom = Tkinter.Frame(self.window, height=80, width=150, relief=RAISED, borderwidth=2)
        self.break_button = Tkinter.Button(self.framebottom, text="Back", command=self.backing)
        self.quit_button = Tkinter.Button(self.framebottom, text="Quit", command=self.quitting)

        self.layout()

    def layout(self):
        # Frame Table
        self.table.place(x=400, y=350, anchor="c")
        # Frame Bottom
        self.framebottom.place(x=400, y=650, anchor="c")
        self.break_button.place(x=60, y=25, anchor="c")
        self.quit_button.place(x=80, y=55, anchor="c")
        self.data()

    def data(self):
        for ix, sustesa in enumerate(self.liste):
            izahl = int(ix + 1)

            pos_name = sustesa[0]
            pos_groesse = sustesa[1]
            pos_datum = sustesa[2]
            pos_verarbeitet = sustesa[3]

            var_ix = Tkinter.StringVar()
            label_ix = Tkinter.Label(self.table, textvariable=var_ix, width=7, relief="sunken", bg='#fff', fg="#000000000", justify='center')
            label_ix.grid(row=0, column=0, sticky=NSEW)
            var_ix.set(ix)

            var_name = Tkinter.StringVar()
            label_name = Tkinter.Label(self.table, textvariable=var_name, width=30, relief="sunken", bg='#fff', fg="#000000000", justify='center')
            label_name.grid(row=0, column=1, sticky=NSEW)
            var_name.set(pos_name)

            var_groesse = Tkinter.StringVar()
            label_groesse = Tkinter.Label(self.table, textvariable=var_groesse, width=18, relief="sunken", bg='#fff', fg="#000000000", justify='center')
            label_groesse.grid(row=0, column=2, sticky=NSEW)
            var_groesse.set(pos_groesse)

            var_datum = Tkinter.StringVar()
            label_datum = Tkinter.Label(self.table, textvariable=var_datum, width=20, relief="sunken", bg='#fff', fg="#000000000", justify='center')
            label_datum.grid(row=0, column=3, sticky=NSEW)
            var_datum.set(pos_datum)

            var_verarbeitet = Tkinter.StringVar()
            label_verarbeitet = Tkinter.Label(self.table, textvariable=var_verarbeitet, width=8, relief="sunken", bg='#fff', fg="#000000000", justify='center')
            label_verarbeitet.grid(row=0, column=4, sticky=NSEW)
            var_verarbeitet.set(pos_verarbeitet)


    def backing(self):
        self.window.withdraw()
        root = Tkinter.Tk()
        Startwindow(root)

    def quitting(self):
        self.window.quit()


class Startwindow:

    def __init__(self, root):
        self.root = root
        self.root.title("MyRootGUI")
        self.root.geometry("%dx%d+%d+%d" % (300, 150, 600, 250))
        self.label = Tkinter.Label(self.root, text="Start Page!", width=15)
        self.start_button = Tkinter.Button(self.root, text="STARTEN", width=15, command=self.start)
        self.close_button = Tkinter.Button(self.root, text="SCHLIESSEN", width=15, command=root.quit)

        self.layout()

    def layout(self):
        self.label.place(relx=.5, rely=.2, anchor="c")
        self.start_button.place(relx=.5, rely=.5, anchor="c")
        self.close_button.place(relx=.5, rely=.75, anchor="c")

    def start(self):
        self.root.withdraw()
        window = Tkinter.Toplevel(self.root)
        tablewin = Tablewindow(window)

    def quitting(self):
        self.root.quit()


if __name__ == '__main__':
    runString = True
    root = Tkinter.Tk()
    startwin = Startwindow(root)
    root.mainloop()
__deets__
User
Beiträge: 3295
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 13. August 2018, 13:41

Ich kenne pyscripter nicht, aber da du nichts mit rpyc machst, wird pyscripter wohl einen extra Prozess starten, und mittels rpyc mit dem kommunizieren. Nur das du dein Programm so schnell beendest, dass die IDE und der Prozess sich noch nicht ins Benehmen gesetzt haben. Kannst du ignorieren.

Zu deinem anderen Fehler kann ich nichts sagen. Ich benutze keine IDE.
Benutzeravatar
__blackjack__
User
Beiträge: 1051
Registriert: Samstag 2. Juni 2018, 10:21

Montag 13. August 2018, 14:16

@DMD-OL: Es darf nur ein Exemplar von `Tk` innerhalb eines Programms geben. Das Du in `backing()` ein weiteres erstellst, ist also auf jeden Fall schon mal falsch und kann zu undefiniertem Verhalten führen.

`os.path` braucht man nicht zu importieren, das wird bereits durch den Import von `os` importiert. `os` ist auch kein Package das ein `path`-Modul enthält. `path` ist ein ganz normales Attribut von `os`.
“Capitalism is the astounding belief that the most wickedest of men will do the most wickedest of things for the greatest good of everyone.” – John Maynard Keynes
DMD-OL
User
Beiträge: 193
Registriert: Samstag 26. Dezember 2015, 16:21
Wohnort: Oldenburg (Oldenburg)

Freitag 7. September 2018, 12:07

ich habe mir noch mal gedanken zur übertragung von einer Tkinter Klasse auf eine zweite gemacht.
in meinem code verwende ich nur einmal .mainloop().
bin mir aber nicht sicher, ob alles wirklich richtig ist und es vielleicht später nicht doch probleme gibt.
vor allem mit:

Code: Alles auswählen

    def close(self):
        self.second.destroy()
        third = Tkinter.Tk()
        MyFirstGUI(third)
das ist glaube ich immer noch nicht ganz korrekt :cry:
mein code:

Code: Alles auswählen

import Tkinter
from Tkinter import TOP, BOTTOM


class MySecondGUI:

    def __init__(self, second):
        self.second = second
        self.second.geometry("%dx%d+%d+%d" % (500, 350, 600, 250))
        self.frame = Tkinter.Frame(second)
        self.frame.pack()

        self.close_button = Tkinter.Button(self.frame, text="BACK", command=self.close)
        self.close_button.pack()

    def close(self):
        self.second.destroy()
        third = Tkinter.Tk()
        MyFirstGUI(third)


class MyFirstGUI:
    def __init__(self, first):
        self.first = first

        self.first.geometry("%dx%d+%d+%d" % (300, 150, 600, 250))
        self.frame = Tkinter.Frame(first)
        self.frame.grid_propagate(False)
        self.frame.pack()

        self.start_button = Tkinter.Button(self.frame, text="SHOW SECOND", command=self.start)
        self.start_button.pack(side=TOP)
        self.close_button = Tkinter.Button(self.frame, text="CLOSE", command=self.first.quit)
        self.close_button.pack(side=BOTTOM)

    def start(self):
        self.first.destroy()
        second = Tkinter.Tk()
        MySecondGUI(second)


root = Tkinter.Tk()
first_gui = MyFirstGUI(root)
root.mainloop()
wie macht man es richtig???
Benutzeravatar
__blackjack__
User
Beiträge: 1051
Registriert: Samstag 2. Juni 2018, 10:21

Freitag 7. September 2018, 13:13

@DMD-OL: Für zusätzliche Fenster verwendet man `Tkinter.Toplevel`.
“Capitalism is the astounding belief that the most wickedest of men will do the most wickedest of things for the greatest good of everyone.” – John Maynard Keynes
DMD-OL
User
Beiträge: 193
Registriert: Samstag 26. Dezember 2015, 16:21
Wohnort: Oldenburg (Oldenburg)

Freitag 7. September 2018, 14:48

wie kann ich das umsetzen???
Sirius3
User
Beiträge: 8265
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 7. September 2018, 15:07

z.b. so:

Code: Alles auswählen

import Tkinter as tk

class MySecondGUI(tk.Toplevel):
    def __init__(self, root):
        tk.Toplevel.__init__(self, root)
        self.root = root
        self.frame = tk.Frame(self)
        self.frame.pack()

        self.close_button = tk.Button(self.frame, text="BACK", command=self.close)
        self.close_button.pack()

    def close(self):
        self.destroy()
        self.root.deiconify()

class MyFirstGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.frame = tk.Frame(self)
        self.frame.grid_propagate(False)
        self.frame.pack()

        self.start_button = tk.Button(self.frame, text="SHOW SECOND", command=self.start)
        self.start_button.pack(side=tk.TOP)
        self.close_button = tk.Button(self.frame, text="CLOSE", command=self.quit)
        self.close_button.pack(side=tk.BOTTOM)

    def start(self):
        self.withdraw()
        self.second = MySecondGUI(self)

def main():
    root = MyFirstGUI()
    root.mainloop()

if __name__ == '__main__':
    main()
DMD-OL
User
Beiträge: 193
Registriert: Samstag 26. Dezember 2015, 16:21
Wohnort: Oldenburg (Oldenburg)

Freitag 7. September 2018, 15:22

MIT VERERBUNG!!! HEFTIG, DA WÄR ICH NIE DRAUF GEKOMM!
THX :lol:
Antworten