Изображение Tkinter не меняется после нажатия кнопки и вызывает закрытие отдельного окна - PullRequest
0 голосов
/ 31 января 2019

Я создал графический интерфейс tkinter, в котором используется программа для работы с сокетами, которая принимает соединения от клиента и создает простое окно для каждого клиента.Я попытался добавить значки изображений в него, но значки изображений не отображаются и (я могу отдельно добавить изображение в простое окно tkinter, но объединить его с приведенным ниже графическим интерфейсом не удается.)

Если я добавляю изображения вокно, то окно не открывается, (оно открылось, при комментировании изображения добавляются строки из программы)

S.py

import socket
from tkinter import *
from threading import Thread
from PIL import ImageTk, Image


root = Tk()
root.title("GUI")
root.geometry('350x200')
root.resizable(width=FALSE, height=FALSE)




def con():
    act_lb1.destroy()
    label_2 = Label(root, text="Activated")
    label_2.place(x=100, y=20, height=55)


    try:



        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        ip = "0.0.0.0"
        port = 4141
        s.bind((ip, port))
        s.listen(5)



        def window(c, ):
            while True:


                popup1 = Toplevel(root)
                popup1.title('Notification')
                popup1.geometry('250x100')
                prompt = " connectiing"
                label1 = Label(popup1, text=prompt, width=len(prompt))
                label1.pack(fill="none", expand=True)

                def close_after_2s():
                    popup1.destroy()

                popup1.after(4000, close_after_2s)
                #popup1.mainloop()


                top = Toplevel(root)
                top.title('H-PINGER')
                top.geometry("200x200")
                top.resizable(width=FALSE, height=FALSE)

                img = ImageTk.PhotoImage(Image.open("13.png"))
                panel = Label(top, image=img)

                prompt = "connected"
                user_lb = Label(top, text=prompt, width=len(prompt))





                user_lb.place(x=50, y=1, height=39)
                panel.place(x=6, y=1, height=39, width=39)

                def rm():
                      pass

                while True:

                   Thread(target=rm).start()

        while True:

            c, addr = s.accept()
            print('Connected with ' + addr[0] + ':' + str(addr[1]))
            if addr[0] != '':
                root.withdraw()



                thread2 = Thread(target=window, args=(c,))
                thread2.start()

        c.close()
        s.close()


    except socket.error as msg:
        print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
        sys.exit()





sp = Button(root, text='Activate', anchor="center", font=30, width="18", height=3,bd=0, activebackground="darkgrey",  command=(lambda: con()))
act_img = PhotoImage(file="l3.png") # make sure to add "/" not "\"
sp.config(image=act_img)
sp.place(x=130,y=80, height=55, width=64)
act_lb1 = Label(root, text="Press the button to activate")
act_lb1.place(x=100, y=20, height=55)

root.mainloop()

C.py

import socket


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 4141

ip = input('Enter the IP Address::')

s.connect((ip, port))

13.png

1 Ответ

0 голосов
/ 31 января 2019

Никогда не используйте цикл while в основном потоке, так как он заблокирует цикл обработки событий tkinter (mainloop()).Так что лучше переместите цикл while в другой поток.Ниже приведен пример кода:

import socket
from tkinter import *
from threading import Thread

root = Tk()
root.title("GUI")
root.geometry("350x200")
root.resizable(width=False, height=False)

def handle_client(c, addr):
    win = Toplevel()
    win.img = PhotoImage(file='l3.png')
    Label(win, image=win.img).pack()
    Label(win, text='Client: {}'.format(addr)).pack()
    msg = Label(win)
    msg.pack()
    while True:
        data = c.recv(1024)
        if data:
            msg.config(text=data)
        else:
            break

def accept_connection():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    ip = '0.0.0.0'
    port = 4141
    s.bind((ip, port))
    s.listen(5)
    while True:
        print('Waiting connection ...')
        c, addr = s.accept()
        print('Connected:', addr)
        t = Thread(target=handle_client, args=(c, addr))
        t.setDaemon(True)
        t.start()

def con():
    act_lb1.config(text='Activated')
    sp.destroy()
    t = Thread(target=accept_connection)
    t.setDaemon(True)
    t.start()

sp = Button(text='Activate', anchor='center', font=30, width=18, height=3, bd=0, activebackground='darkgrey', command=con)
act_img = PhotoImage(file='l3.png')
sp.config(image=act_img)
sp.place(x=130, y=80, height=55, width=64)

act_lb1 = Label(text='Press the button to activate')
act_lb1.place(x=100, y=20, height=55)

root.mainloop()

Пример кода клиента для подключения вышеуказанного сервера:

import socket
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 4141))
s.send(b'hello' if len(sys.argv) == 1 else str.encode(sys.argv[1]))
s.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...