2016-05-06 11 views
-1

Jedes Mal wenn ich meine TK-App starte, friert es ein, glaube, dass es etwas mit dem Queue Modul zu tun hat.Tk Python App friert ein, wenn die Warteschlange verwendet wird

Mein Code:

import socket, os, multiprocessing, queue 
import tkinter as tk 

#---global variables---# 

setup = '' 
cleintsocket = '' 
port = 0 
q = queue.Queue() 

#---Defs---# 

def setup(): 
    global host, port, user 
    host = setup_host_box.get() 
    port = setup_port_box.get() 
    user = setup_user_box.get() 
    if port == '': 
     port = 8545 
    create_sock(host, int(port)) 

def connect_buffer(self, hostname, connectingport): 
    connect(self, hostname, connectingport) 

def connect(self, hostname, connectingport): 
    '''connects to a port''' 
    if hostname == '': 
     hostname = 'localhost' 
    self.connect((hostname, connectingport)) 
    resvbackgroung = multiprocessing.Process(target = resv) 
    resvbackgroung.start() 
    chat() 

def create_sock(nhost, nport): 
    '''create the cleint's socket''' 
    global cleintsocket 
    cleintsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    connect(cleintsocket, nhost, nport) 

def send(username, cleintsock): 
    '''to send a message''' 
    usrmsg = (username + ' - ' + chat_msg_box.get()).encode() 
    cleintsock.send(usrmsg) 

def resv(): 
    '''resive subscript, run through mutiprosses module''' 
    while True: 
     rmsg = cleintsocket.recv(1024).decode() 
     q.put(rmsg) 

def chat(): 
    '''loads chat page''' 
    setup_host_text.pack_forget() 
    setup_host_box.pack_forget() 
    setup_port_text.pack_forget() 
    setup_port_box.pack_forget() 
    setup_user_text.pack_forget() 
    setup_user_box.pack_forget() 
    setup_confirm_button.pack_forget() 
    chat_msg_display_text.pack() 
    chat_msg_box.pack() 
    chat_msg_send_button.pack() 
    chat_disconnect_button.pack() 
    while True: 
     while not q.empty(): 
      msg = q.get() 
      chat_msg_display_text.insert('END.END', msg) 

def start(): 
    '''starts the setup page''' 
    setup_host_text.pack() 
    setup_host_box.pack() 
    setup_port_text.pack() 
    setup_port_box.pack() 
    setup_user_text.pack() 
    setup_user_box.pack() 
    setup_confirm_button.pack() 


def disconnect(): 
    '''safely closes the socket and sends a desconnect msg''' 
    cleintsocket.send((user + 'has disconnected').encode()) 
    cleintsocket.close() 
    quit() 

def send_button_callback(): 
    '''add a buffer to allow time for 'cleintsocket' to be defined in 'create_sock()''' 
    send(user, cleintsocket) 

#---TK Setup---# 

#--window setup--# 

window = tk.Tk() 
window.title('Chat') 
window.geometry('600x600') 
window.configure(background='#ffffff') 

#--connection setup page--# 

setup_host_text = tk.Label(window, text = 'Host') 
setup_host_box = tk.Entry(window, bg = '#ffffff') 
setup_port_text = tk.Label(window, text = 'Port') 
setup_port_box = tk.Entry(window, bg = '#ffffff') 
setup_user_text = tk.Label(window, text = 'Username') 
setup_user_box = tk.Entry(window, bg = '#ffffff') 
setup_confirm_button = tk.Button(window,text = 'Connect', command = setup) 

#--chat page--# 

chat_msg_box = tk.Entry(window, bg='#ffffff') 
chat_msg_send_button = tk.Button(window, text = 'send', command = send_button_callback) 
chat_msg_display_text = tk.Text(window, width=600, height=20, insertborderwidth = 3, wrap = 'word') 
chat_disconnect_button = tk.Button(window, text = 'Disconnect', command = disconnect) 

#--------------# 

start() 

Danke,

CB

+1

Bitte nicht mit Code auf einer anderen Website verknüpfen. Vielleicht möchten Sie http://www.stackoverflow.com/help/mcve lesen, wenn Sie dies nicht bereits getan haben. –

+0

@BryanOakley Eigentlich habe ich _have_ gelesen die Seite 'Wie erstelle ich ein minimales, vollständiges und verifizierbares Beispiel' und es sagt nicht, dass Sie keinen Code auf eine andere Website setzen sollten, ich lege meinen Code in den Pasten-Bin, weil es einfacher ist Code zu formatieren (übrigens, danke Pythonista für den Schnitt) in ein einfaches Format für Menschen, um als Code zu lesen (anstatt Tabellierung jeder Zeile des Codes), also bevor Sie jemanden sagen, die MCVE-Seite zu lesen, warum nicht Du? –

+0

MCVE ist mehr als nur, wo man den Code ablegt. Sie haben viel unnötigen Code eingefügt. Außerdem müssen Sie nicht jede Zeile "ablegen". Kopieren Sie Ihren gut formatierten Code. Einfügen in das Bearbeitungsfeld Wählen Sie den gesamten Code aus. Klicken Sie auf die Schaltfläche, die wie folgt aussieht: '{}'. Sie sind fertig. –

Antwort

0

Das Problem in Ihrer connect Funktion ist:

Sie Setup Multiprozessing, resv als Ziel die Funktion setzen für Dieser Prozess, den Sie gerade hervorgebracht haben.

Sie starten dann den Prozess, und Sie rufen chat direkt danach, die eine while True Schleife darin hat.

Dies blockiert den Hauptereignis-Thread von tkinter.

+0

Ah, also brauche ich welche Form des Puffers oder muss ich die While-Schleife in eine andere Funktion stecken? –

+0

Nach ein bisschen googeln stieß ich auf einen Thread (http://stackoverflow.com/questions/18679102/tkinter-managing-my-event) -loops-longitudinal-my-mainloop [link]), das mir sehr geholfen hat, dass ich ein 'self.after (1000, funtion1)' verwenden könnte, damit der update_text sich nach einer bestimmten Zeit selbst anmeldet. –

Verwandte Themen