Zwei simultane Tkinter-Funktionen

Fragen zu Tkinter.
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

hallo
versuche grad zwei fenster simultan zu öffnen.
was mache ich falsch?

Code: Alles auswählen

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

import Tkinter
import threading
from multiprocessing import Process

def erfassung_Starten():

    window_1 = Tkinter.Tk()
    window_1.title('DMD-DATA.soft')
    window_1.geometry('800x600+385+150')

    def win_beenden():
        window_1.destroy()
     
    b = Tkinter.Button(window_1, text=("\nBEENDEN\n"), font=('Arial', 10, 'bold'), width=20, relief="raised", borderwidth=3, fg='#000000000', justify='center',command=win_beenden)
    b.place(relx=.51, rely=.82, anchor="c")
    window_1.mainloop()


def server_Starten():

    backwin = Tkinter.Tk()
    backwin.title('DMD-DATA.soft')
    backwin.state('zoomed')
    backwin.configure(background='black')

    def back_beenden():
        backwin.destroy()

    b = Tkinter.Button(backwin, text=("\nBEENDEN\n"), font=('Arial', 10, 'bold'), width=20, relief="raised", borderwidth=3, fg='#000000000', justify='center',command=back_beenden)
    b.place(relx=.51, rely=.82, anchor="c")
    backwin.mainloop()


if __name__=='__main__':

     p1 = Process(target = erfassung_Starten)
     p2 = Process(target = server_Starten)

     p1.start()
     p2.start()

     p1.join()
     p2.join()

    #t1 = threading.Thread(target=erfassung_Starten)
    #t1.start()
    #t1.join()
    #t2 = threading.Thread(target=server_Starten)
    #t2.start()
    #t2.join()
Zuletzt geändert von Anonymous am Donnerstag 8. Dezember 2016, 14:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@DMD-OL: Was genau verstehst Du an der Ausnahme denn nicht die auf der Konsole ausgegeben wird?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

eine explizite ausgabe erhalte ich nicht.
wegen .join() läuft eine dauerschleife
wenn ich .join() auskommentiere erhalte ich nichts.
wieso bekomme ich die beiden fenster nicht angezeigt???
BlackJack

@DMD-OL: Tja, ich erhalte eine Ausgabe einer Ausnahme auf der Konsole. Wie startest Du das Programm denn?
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

direkt in python mit run-button
mit cmd bekomme ich auch keine ausnahme.
ich habe im grunde zwei einzelne programme, die für sich selbst funktionieren:
1. ein programm nur mit tkinter fenstern, stirngvar(), funktionen...usw.
2. das zweite ist ein servercode, der ein tkinter fenster enthält, mit dem ich denjenigen der sich am rechner anmeldet, ausgibt. den server starte
ich darin mit einem threading.Thread.
die beiden möchte ich jetzt gern zusammenfügen, wobei der server im hintergrund laufen soll, damit man mit dem anderen programm arbeiten kann.
ich hab schon viel versucht, bekomm es aber nicht richtig hin.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Beziehungsweise habe ich es FAST zum laufen gebracht.
nur jetzt wird "freeNum" nicht korrekt im Entry angezeigt, d.h. gar nicht...

Code: Alles auswählen

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

import Tkinter
import threading
import socket
import os
import sqlite3

backwin = Tkinter.Tk()
backwin.title('DMD-DATA.soft')
backwin.state('zoomed')
backwin.configure(background='black')

start_Server = Tkinter.StringVar()
l_sf1 = Tkinter.Label(backwin,textvariable=(start_Server),font=('Arial', 8, 'bold'), height=3, width=25, fg="#000000000",justify='left')
l_sf1.place(relx=.06, rely=.965, anchor="c")

start_Client = Tkinter.StringVar()
l_sf2 = Tkinter.Label(backwin,textvariable=(start_Client),font=('Arial', 8, 'bold'), height=3, width=35, fg="#000000000",justify='left')
l_sf2.place(relx=.2, rely=.965, anchor="c")

def run(start_Server,start_Client):

    get_IP = [TCP_IP for TCP_IP in socket.gethostbyname_ex(socket.gethostname())[2] if not TCP_IP.startswith("127.")][:1]
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_address = ((TCP_IP, 0))
    sock.bind(server_address)
    TCP_PORT = sock.getsockname()[1]
    ipPort = "IP-Adresse: "+str(TCP_IP)+"\n                  Port: "+str(TCP_PORT)
    start_Server.set("SERVER GESTARTET:\n     "+ipPort)
    sock.listen(5)

    while True:
        client,addr = sock.accept()
        now = datetime.datetime.now()
        currentTime = now.strftime("%d.%m.%Y, %H:%M:%S")
        server_Message = "\n---> DMD-Server ("+str(currentTime)+")\n"
        client.send(server_Message)
        data = client.recv(25000)
        json_data  = json.loads(data)
        user = json_data['User']
        client_Message = "\n---> "+str(user)+" ("+str(currentTime)+")\n"
        start_Client.set(client_Message)
        print json_data
        client.close()

    sock.close()

new_thread = threading.Thread(target=run,args=(start_Server,start_Client,))
new_thread.start()

def haupt_Start():

    ka_fenster = Tkinter.Tk()
    ka_fenster.title('DMD-DATA.soft')
    ka_fenster.geometry('600x300+485+200')

    kontonummer = Tkinter.StringVar()
    e_ka6 = Tkinter.Entry(ka_fenster,textvariable=kontonummer, width=6, relief="sunken", borderwidth=3, fg='#000000000', justify='center')
    e_ka6.place(relx=.53, rely=.3, anchor="w")
    var1 = Tkinter.IntVar()

    def konto_nummerNEU():

        desktopFile = os.path.expanduser("~\Desktop")
        path_grund = desktopFile+'\Beispielordner\SYSTEM'
        path_adressen = path_grund+'\Adressenliste'
        SQL_Adressdateien = '%s\\Adressenliste.db'  %(path_adressen)
        try:
            os.makedirs(path_adressen)
        except:
            pass
        con = sqlite3.connect(SQL_Adressdateien)
        cursor = con.cursor()
        cursor.execute('''CREATE TABLE IF NOT EXISTS Adressenliste(id INTEGER PRIMARY KEY, ktoNum INT UNIQUE, vorName TEXT, nachName TEXT)''')
        cursor = con.cursor()
        cursor.execute('''SELECT ktoNum, vorName, nachName FROM Adressenliste''')
        aktuellesKontoisa = cursor.fetchall()
        try:
            num_List = []
            for numbas in aktuellesKontoisa:
                v_number = numbas[0]
                num_List.append(v_number)
            a = sorted(num_List)
            nums = (b for a,b in izip(a,count(a[0])) if a != b)
            freeNum = next(nums,'None')
            if freeNum != 'None':
                kontonummer.set(freeNum)
            else:
                freeNum = a[-1] + 1
                kontonummer.set(freeNum)
        except:
            freeNum = 0
            kontonummer.set(freeNum)
        con.close()

        print freeNum

    b_ka1 = Tkinter.Button(ka_fenster, text=('Nächste freie\nBV-Nummer'), width=15, height=2, relief="raised", borderwidth=3, fg='#000000', justify='center',command=konto_nummerNEU)
    b_ka1.place(relx=.48, rely=.45, anchor="w")

b1 = Tkinter.Button(backwin, text=("\nSTART\n"), font=('Arial', 10, 'bold'), width=20, relief="raised", borderwidth=3, fg='#000000000', justify='center',command=haupt_Start)
b1.place(relx=.51, rely=.4, anchor="c")

def beenden():
    backwin.destroy()

b2 = Tkinter.Button(backwin, text=("\nBEENDEN\n"), font=('Arial', 10, 'bold'), width=20, relief="raised", borderwidth=3, fg='#000000000', justify='center',command=beenden)
b2.place(relx=.51, rely=.55, anchor="c")

backwin.mainloop()
warum bekomme ich denn die nächste freie nummer nicht auch im entry angezeigt???
Zuletzt geändert von Anonymous am Donnerstag 8. Dezember 2016, 18:05, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@DMD-OL: Python hat keinen Run-Button. Also welche Anwendung verwendest Du die so einen Button hat?

Hm, also ich bekomme eine Ausnahme. Und wenn ich die betreffende Zeile auskommentiere dann bekomme ich auch die beiden Fenster angezeigt.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

ich meinte den run-button in PyScripter.
also vielleicht kann ich ja auch einmal helfen....
habs schon selbst gelöst :)
alle fenster müssen slaves des hintergrundfensters "backwin" (Tkinter.Toplevel(backwin)) sein!
damit funktionieren auch die Tkinter.StringVar() bei mir wieder einwandfrei.
habt dank :)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi DMD-OL

Habe bei deinem Skript hauptsächlich .place() durch .pack() ersetzt und die Reihenfolge der Anweisungen und Funktionen geändert. Wie du schon selber festgestellt hast darf man Tkinker.Tk() in einer Anwendung nicht zweimal benützen. Weiter benötigte Fenster sollten also mit Tkinter.Toplevel() erzeugt werden:

Code: Alles auswählen

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

from functools import partial 
import Tkinter as tk
import threading
import socket
import os
import sqlite3

CREATE_TABLE = '''CREATE TABLE IF NOT EXISTS Adressenliste(
    id INTEGER PRIMARY KEY, ktoNum INT UNIQUE, vorName TEXT, nachName TEXT)'''
SELECT_01 = '''SELECT ktoNum, vorName, nachName FROM Adressenliste'''

def run(start_Server,start_Client):
    get_IP = [TCP_IP for TCP_IP in socket.gethostbyname_ex(
        socket.gethostname())[2] if not TCP_IP.startswith("127.")][:1]
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_address = ((TCP_IP, 0))
    sock.bind(server_address)
    TCP_PORT = sock.getsockname()[1]
    ipPort = "SERVER GESTARTET:\nIP-Adresse: {}\nPort: {}".format(str(TCP_IP),
        str(TCP_PORT))
    start_Server.set(ipPort)
    sock.listen(5)
 
    while True:
        client,addr = sock.accept()
        now = datetime.datetime.now()
        currentTime = now.strftime("%d.%m.%Y, %H:%M:%S")
        server_Message = "\n---> DMD-Server ("+str(currentTime)+")\n"
        client.send(server_Message)
        data = client.recv(25000)
        json_data  = json.loads(data)
        user = json_data['User']
        client_Message = "\n---> "+str(user)+" ("+str(currentTime)+")\n"
        start_Client.set(client_Message)
        print json_data
        client.close()
 
    sock.close()
  
def haupt_Start():
    ka_fenster = tk.Toplevel()
    #ka_fenster = tk.Tk()
    ka_fenster.title('DMD-DATA.soft')
    ka_fenster.geometry('600x300+485+200')
    
    frame = tk.Frame(ka_fenster)
    frame.pack(expand=True)
 
    kontonummer = tk.StringVar()
    e_ka6 = tk.Entry(frame,
        textvariable=kontonummer, width=6, relief="sunken", borderwidth=3,
        fg='#000000000', justify='center')
    e_ka6.pack(pady=4)
    #e_ka6.place(relx=.53, rely=.3, anchor="w")
    var1 = tk.IntVar()
 
    def konto_nummerNEU():
        desktopFile = os.path.expanduser("~\Desktop")
        path_grund = desktopFile+'\Beispielordner\SYSTEM'
        path_adressen = path_grund+'\Adressenliste'
        SQL_Adressdateien = '%s\\Adressenliste.db'  %(path_adressen)
        try:
            os.makedirs(path_adressen)
        except: # IOError:
            print('Das Verzeichnis {} existiert bereits'.format(path_adressen))
            pass
        con = sqlite3.connect(SQL_Adressdateien)
        cursor = con.cursor()
        cursor.execute(CREATE_TABLE)
        cursor = con.cursor()
        cursor.execute(SELECT_01)
        aktuellesKontoisa = cursor.fetchall()
        try:
            num_List = []
            for numbas in aktuellesKontoisa:
                v_number = numbas[0]
                num_List.append(v_number)
            a = sorted(num_List)
            nums = (b for a,b in izip(a,count(a[0])) if a != b)
            freeNum = next(nums,'None')
            if freeNum != 'None':
                kontonummer.set(freeNum)
            else:
                freeNum = a[-1] + 1
                kontonummer.set(freeNum)
        except:
            freeNum = 0
            kontonummer.set(freeNum)
        con.close()
 
        print freeNum
 
    b_ka1 = tk.Button(frame,
        text=('Nächste freie\nBV-Nummer'), width=15, height=2, relief="raised",
        borderwidth=3, fg='#000000', justify='center',command=konto_nummerNEU)
    b_ka1.pack(pady=4)
    #b_ka1.place(relx=.48, rely=.45, anchor="w")
  
def beenden(backwin):
    backwin.destroy()
 
def main():
    backwin = tk.Tk()
    backwin.title('DMD-DATA.soft')
    #backwin.state('zoomed')
    backwin.configure(background='black')

    frame = tk.Frame(backwin, bg=backwin['bg'])
    frame.pack(expand=True, padx=4, pady=4)

    b1 = tk.Button(frame,
        text=("\nSTART\n"), font=('Arial', 10, 'bold'), width=20,
        relief="raised", borderwidth=3, fg='#000000000', justify='center',
        highlightthickness=0, command=haupt_Start)
    b1.pack(pady=4)
    #b1.place(relx=.51, rely=.4, anchor="c")

    b2 = tk.Button(frame,
        text=("\nBEENDEN\n"), font=('Arial', 10, 'bold'), width=20,
        relief="raised", borderwidth=3, fg='#000000000', justify='center',
        highlightthickness=0, command=partial(beenden, backwin))
    b2.pack(pady=4)
    #b2.place(relx=.51, rely=.55, anchor="c")
    
    start_Server = tk.StringVar()
    l_sf1 = tk.Label(frame,
        textvariable=(start_Server),font=('Arial', 8, 'bold'), height=3,
        width=25, fg="#000000000",justify='left')
    l_sf1.pack(pady=4)
    #l_sf1.place(relx=.06, rely=.965, anchor="c")
     
    start_Client = tk.StringVar()
    l_sf2 = tk.Label(frame,
        textvariable=(start_Client),font=('Arial', 8, 'bold'), height=3,
        width=35, fg="#000000000",justify='left')
    l_sf2.pack(pady=4)
    #l_sf2.place(relx=.2, rely=.965, anchor="c")

    new_thread = threading.Thread(target=run,args=(start_Server,start_Client,))
    new_thread.start()

    backwin.mainloop()

if __name__ == "__main__":
    main()
Gruss wuf :wink:
Take it easy Mates!
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

coole sache.
sehr schön. hilft mir mein verständnis aufzubessern, sauberen code zu schreiben.
bin ja schon oft kritisiert worden deswegen :)
Antworten