Program pokazuje 2 razy to samo okno, jak temu zapobiec?

Odpowiedz Nowy wątek
2019-06-05 14:22
0

Witam!

Jestem początkującym w Pythonie, i napotkałem się na pewien problem. Wygląda on tak że jak otwieram program za pomocą CMD to wszystko jest w porządku, a jak chcę stworzyć z pliku Pythona, program z rozszerzeniem .exe, to przy otwieraniu program się chyba zaplęta i otwiera mi dwa razy to samo okno. Może ktoś z was będzie wiedział jak temu zapobiec to byłbym bardzo wdzięczny. Używam systemu Windows. poniżej przesyłam kod pliku, czy potrzeba również plik exe?

from psutil import virtual_memory
from gpuinfo.windows import get_gpus
from tkinter import *
import multiprocessing
import psutil
import cpuinfo
import pymysql
import bcrypt
import re

def patch_crypto_be_discovery():
    """
    Monkey patches cryptography's backend detection.
    Objective: support pyinstaller freezing.
    """

    from cryptography.hazmat import backends

    try:
        from cryptography.hazmat.backends.commoncrypto.backend import backend as be_cc
    except ImportError:
        be_cc = None

    try:
        from cryptography.hazmat.backends.openssl.backend import backend as be_ossl
    except ImportError:
        be_ossl = None

    backends._available_backends_list = [
        be for be in (be_cc, be_ossl) if be is not None
    ]

def sprawdz(event):

    multiprocessing.freeze_support()

    con = pymysql.connect(host='localhost', user='root',
                          password='', database='maxbench')
    with con:
        abc = entry2.get()
        email = abc
        cur = con.cursor()

        cur.execute(
            "SELECT  * from users where email=%s ", email)

        rows = cur.fetchall()
        for row in rows:
            numer_id = ("{0}".format(row[0]))
    con.commit()
    info = cpuinfo.get_cpu_info()['brand'].split('@', 1)
    Proc = info[0]

    obj_Disk = psutil.disk_usage('/')
    a = obj_Disk.free / (1024**3)
    Disc = ('%.0f GB' % a)

    mem = virtual_memory()
    b = mem.total / (1024**3)
    Mem = ('%.0f GB' % b)

    connection = pymysql.connect(host='localhost', user='root',
                                 password='', database='maxbench')
    cursor = connection.cursor()
    sql = "INSERT INTO components(user_id,cpu,ram,disc) VALUES('%s','%s','%s','%s')" \
        % (numer_id, Proc, Mem, Disc)
    cursor.execute(sql)

    karty = []
    wyjatki = ["(R)", 'NVIDIA', 'Graphics', ]
    for gpu in get_gpus():
        karty.append(re.sub("|".join(wyjatki), "", gpu.name))

        # karty.append(gpu.name.replace('Intel(R)' + HD + 'Graphics', ''))
    for i in range(len(karty)):
        sql1 = "INSERT INTO user_videos(user_id,gpu) VALUES('%s','%s')" \
            % (numer_id, karty[i])
        cursor.execute(sql1)
        connection.commit()

    okno = Tk()
    okno.title("Sprawdź podzespoły:")
    okno.geometry("320x160")
    okno.eval('tk::PlaceWindow %s center' %
              okno.winfo_pathname(okno.winfo_id()))
    okno.resizable(0, 0)
    # p = StringVar()
    etykieta = Label(okno, text="Procesor: " + Proc)
    etykieta.pack()
    # p.set("Procesor: " + Proc)

    # m = StringVar()
    etykieta1 = Label(okno, text="Pamięć ram: " + Mem)
    etykieta1.pack()
    # m.set("Pamięć ram: " + Mem)

    # d = StringVar()
    etykieta2 = Label(okno, text="Dostępne miejsce na dysku: " + Disc)
    etykieta2.pack()
    # d.set("Dostępne miejsce na dysku: " + Disc)

    # k = StringVar()
    etykieta3 = Label(okno, text='\n'.join('Karta graficzna: {}'.format(karta)
                                           for karta in karty))
    etykieta3.pack()
    # s = '\n'.join('Karta graficzna: {}'.format(karta)
    # for karta in karty)
    # k.set(s)

    def close(event):
        okno.destroy()
        okno1.destroy()
    przycisk = Button(okno, text="Zamknij program")
    przycisk.bind("<Button-1>", close)
    przycisk.pack()
    okno.mainloop()

okno1 = Tk()
okno1.title('Zaloguj sie')
okno1.geometry("320x220")
okno1.eval('tk::PlaceWindow %s center' %
           okno1.winfo_pathname(okno1.winfo_id()))
okno1.resizable(0, 0)

# v = StringVar()
label1 = Label(okno1, text="Podaj email: ")
label1.pack()
entry2 = Entry(okno1)
entry2.pack()
# s = v.get()

# p = StringVar()
label2 = Label(okno1, text="Podaj hasło: ")
label2.pack()
entry1 = Entry(okno1)
entry1.pack()
# password2 = p.get()

# password2 = input("password: ")

def click(event):
    abc = entry2.get()
    email = abc

    passwd = entry1.get()
    password2 = passwd

    con = pymysql.connect(host='db4free.net', user='kwakus18',
                          password='Kwakus1998', database='podzespoly')
    with con:

        cur = con.cursor()

        password1 = cur.execute(
            "SELECT  * from users where email=%s ", email)

        rows = cur.fetchall()
        for row in rows:
            password1 = ("{0}".format(row[4]))
            # hashed = bcrypt.hashpw(password1, bcrypt.gensalt())
            if bcrypt.hashpw(password2.encode(encoding='UTF-8', errors='strict'), password1.encode(encoding='UTF-8', errors='strict')) == password1.encode(encoding='UTF-8', errors='strict'):
                yes = Label(okno1, text="Logowanie udane")
                yes.pack()
                mButton1 = Button(
                    okno1, text="Sprawdź podzespoły")
                mButton1.bind("<Button-1>", sprawdz)
                mButton1.pack()

            else:
                yes1 = Label(okno1, text="Logowanie nieudane")
                yes1.pack()

mButton = Button(okno1, text="Zaloguj się")
mButton.bind("<Button-1>", click)
mButton.pack()
okno1.mainloop()

Pozostało 580 znaków

2019-06-07 14:46
0

Generalnie odpalanie 2 razy mainloop to średni pomysł. Lepszym rozwiązaniem byłoby przerobienie twoich okien na 2 oddzielnej klasy. Z czego jedna implementuje tk.Frame a druga tk.TopLevel.

Tworzenie okien po kliknięciu w przycisk
Po polsku i lepiej opisane

Powinieneś mieć 1 mainloop to raz, Poza tym powinna istnieć tylko jedna instancja klasy tk.Tk().

root = Tk()
root.geometry("1600x800+0+0")
root.title("Okno Główne")

def open_window()
      top = Toplevel()
      top.geometry("800x400+0+0")
      top.title("Second Window")

btn = Button(text = "Open Window", command = open_window)

root.mainloop()

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0