Не работают функции и соответственно кнопки в Menu (Tkinter)
Не работают функции и соответственно кнопки в меню. Не пойму в чем дело ведь когда раньше так делал все работало. Может проблема Код:
import socket
import threading
import tkinter
import tkinter.scrolledtext
from tkinter import simpledialog
class Client:
def __init__(self):
msg = tkinter.Tk()
msg.withdraw()
self.host = simpledialog.askstring('IP','Please write down IP of the host',parent=msg)
self.port = simpledialog.askinteger('Port','Please write down Port of the host',parent=msg)
self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.sock.connect((self.host,self.port))
self.c=tkinter.IntVar()
self.c1=tkinter.IntVar()
self.c2=tkinter.IntVar()
self.c4=tkinter.IntVar()
self.c.trace_add("write", self.colorbg)
self.c1.trace_add("write", self.size)
self.c2.trace_add("write", self.colorfg)
self.c4.trace_add("write", self.sizelbl)
self.nickname = simpledialog.askstring('Nickname','Please choose a nickname',parent=msg)
self.gui_done = False
self.running = True
gui_thread = threading.Thread(target=self.gui_loop)
receive_thread = threading.Thread(target=self.receive)
gui_thread.start()
receive_thread.start()
def gui_loop(self):
self.win = tkinter.Tk()
self.win.configure(bg = 'lightgray')
self.mainmenu = tkinter.Menu(master = self.win)
self.bgmenu = tkinter.Menu(master = self.mainmenu)
self.sizemenu = tkinter.Menu(master = self.mainmenu)
self.mainmenu.add_cascade(label = 'Background color', menu = self.bgmenu)
self.mainmenu.add_cascade(label = 'Size', menu = self.sizemenu)
self.bgmenu.add_radiobutton(label = 'Red',variable = self.c,value = 1,command = self.colorbg)
self.bgmenu.add_radiobutton(label = 'Yellow',variable = self.c,value = 2,command = self.colorbg)
self.bgmenu.add_radiobutton(label = 'Blue',variable = self.c,value = 3,command = self.colorbg)
self.sizemenu.add_radiobutton(label = 'Small',variable = self.c1,value = 1,command = self.size)
self.sizemenu.add_radiobutton(label = 'Medium',variable = self.c1,value = 2,command = self.size)
self.sizemenu.add_radiobutton(label = 'Big',variable = self.c1,value = 3,command = self.size)
self.fgcol_menu = tkinter.Menu(master = self.mainmenu)
self.size_lbl = tkinter.Menu(master = self.mainmenu)
self.mainmenu.add_cascade(label = 'Foreground color',menu = self.fgcol_menu)
self.mainmenu.add_cascade(label = 'Label size',menu = self.size_lbl)
self.fgcol_menu.add_radiobutton(label = 'Red',variable = self.c2,value = 1,command = self.colorfg)
self.fgcol_menu.add_radiobutton(label = 'Black',variable = self.c2,value = 2,command = self.colorfg)
self.fgcol_menu.add_radiobutton(label = 'Blue',variable = self.c2,value = 3,command = self.colorfg)
self.size_lbl.add_radiobutton(label = 'Arial',variable = self.c4,value = 1,command = self.sizelbl)
self.size_lbl.add_radiobutton(label = 'Comic sans',variable = self.c4,value = 2,command = self.sizelbl)
self.size_lbl.add_radiobutton(label = 'Copperplate',variable = self.c4,value = 3,command = self.sizelbl)
self.win.config(menu= self.mainmenu)
self.chat_label = tkinter.Label(self.win, text ="Chat", bg = 'lightgray')
self.chat_label.pack(padx = 20,pady =5)
self.text_area = tkinter.scrolledtext.ScrolledText(self.win)
self.text_area.pack(padx = 20, pady =5)
self.text_area.config(state = 'disabled')
self.msg_label = tkinter.Label(self.win, text ="Message", bg = 'lightgray')
self.msg_label.pack(padx = 20,pady =5)
self.input = tkinter.Text(self.win,height=5)
self.input.pack(padx = 20,pady = 5)
self.send_btn = tkinter.Button(self.win, text = 'Send', command = self.write)
self.send_btn.pack(padx = 20,pady=5)
self.gui_done=True
self.win.protocol('WM_DELETE_WINDOW',self.stop)
self.win.mainloop()
def colorbg(self,*args):
if self.c.get() == 1:
self.win.config(bg = 'red')
elif self.c.get() == 2:
self.win.config(bg = 'black')
elif self.c.get() == 3:
self.win.config(bg = 'blue')
def size(self,*args):
if self.c1.get() == 1:
self.win.geometry('300x300')
elif self.c1.get() == 2:
self.win.geometry('500x500')
elif self.c1.get() == 3:
self.win.geometry('800x800')
def colorfg(self,*args):
if self.c2.get() == 1:
self.text_area(fg = f'red')
self.input(fg = f'red')
elif self.c2.get() == 2:
self.text_area(fg = ('yellow'))
self.input(fg = f'red')
elif self.c2.get() == 3:
self.text_area(fg = f'blue')
self.input(fg = f'red')
else:
self.text_area(fg = 'black')
self.input(fg = f'red')
def sizelbl(self,*args):
if self.c4.get() == 1:
self.text_area(font = ('Arial'))
self.input(font = ('Arial'))
elif self.c4.get() == 2:
self.text_area(font = ('Comic sans'))
self.input(font = ('Arial'))
elif self.c4.get() == 3:
self.text_area(font = ('Copperplate'))
self.input(font = ('Arial'))
def write(self):
message = f'{self.nickname}: {self.input.get("1.0","end")}'
self.sock.send(message.encode('utf-8'))
self.input.delete('1.0','end')
def receive(self):
while self.running:
try:
message = self.sock.recv(1024).decode('utf-8')
if message == 'NICK':
self.sock.send(self.nickname.encode('utf-8'))
else:
if self.gui_done:
self.text_area.config(state = 'normal')
self.text_area.insert('end',message)
self.text_area.yview('end')
self.text_area.config(state='disabled')
except ConnectionAbortedError:
break
except:
print('Error')
self.sock.close
break
def stop(self):
self.running = False
self.win.destroy()
self.sock.close
exit(0)
client = Client()
Источник: Stack Overflow на русском