簡體   English   中英

PyInstaller 后 tkinter GUI 黑屏

[英]tkinter GUI blacked out screen after PyInstaller

在我的腳本上使用 PyInstaller 后,包含 tk GUI,output GUI 將顯示黑屏。 但是,我所有的小部件都在工作。 當我嘗試 hover 鼠標在屏幕上並嘗試按下並與 GUI 交互時,它可以工作。

所以 GUI 工作得很好,但是屏幕變黑了,我什么也看不到。

知道如何以及為什么會發生這種情況嗎? 怎么修?

代碼:

#main.py
import tkinter as tk
from tkinter import ttk
from parse_currency import CurrencyData
from tkinter import messagebox as mb
from PIL import ImageTk, Image
import sys, os

root = tk.Tk()
root.title('Currency Converter')
root.geometry('380x400')
root.config(bg='#122738')

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)


def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)


data = CurrencyData()




img_btn = ImageTk.PhotoImage(Image.open(resource_path('img/again.png')))
again_btn = tk.Button(root, image=img_btn)

logo = ImageTk.PhotoImage(Image.open(resource_path('img/icon_s.png')))

img_convert = ImageTk.PhotoImage(Image.open(resource_path('img/convert.png')))


def build_app():
    ''' * The App's widgets * '''
    #Titale 
    logo_l = tk.Label(
        root,
        image=logo
        )
    
    
    # From 
    from_l = tk.Label(
        root,
        text='From: ',
        bg='#122738',
        fg='#0090C5',
        font=('Times New Roman', 20, 'bold'))
    cur1 = tk.StringVar(value='Select currency')
    from_cur = tk.OptionMenu(root, cur1, *data.currencies)
    from_cur.config(bg='#122738', width=20)
    
    
    
    # To
    to_l = tk.Label(
        root, 
        text='To: ', 
        bg='#122738',
        fg='#0090C5', 
        font=('Times New Roman', 20, 'bold'))
    cur2 = tk.StringVar(value='Select currency')
    to_cur = tk.OptionMenu(root, cur2, *data.currencies)
    to_cur.config(bg='#122738', width=20)
    
    
    # Input
    num = tk.StringVar()
    num_e = tk.Entry(
        root,
        width=20,
        )
    
    # Convert
    convert_btn = tk.Button(root, image=img_convert)  
    
        
    # Result
    result_l = tk.Label(
        root,
        relief=tk.SUNKEN,
        justify=tk.CENTER, 
        width=20,
        bg='#f59abe',
        fg='blue',
        font=(
            'Times New Roman',
            20,
            'bold'
        )
        )
    
    ''' * Widgets Management * '''
    logo_l.grid(row=0, column=0, columnspan=3, pady=10)
    from_l.grid(row=5, column=0, sticky='w')
    from_cur.grid(row=5, column=2, columnspan=2, sticky='we', padx=10)
    to_l.grid(row=6, column=0, sticky='w')
    to_cur.grid(row=6, column=2, columnspan=2, sticky='we', padx=10)
    
    num_e.grid(row=12, column=0, columnspan=3, pady=10)
    
    convert_btn.grid(row=99, column=0, columnspan=3, pady=10)
    result_l.grid(row=100, column=0, columnspan=3, pady=10)
    
    
    ''' * Logic and code * '''
    
    def convert():
        from_var = cur1.get()
        to_var = cur2.get()
        
        try:
            amount = float(num_e.get())
            from_index = data.currencies.index(from_var)
            to_index = data.currencies.index(to_var)
            
            d = amount*data.to_usd[from_index]
            r = d*data.from_usd[to_index] 
            if from_index == 0:
                r=amount*data.from_usd[to_index]
                
            if to_index == 0:
                r=amount*data.to_usd[from_index]
                
            result_l.config(text=round(r, 2))           

        except:
            mb.showerror(
            title='Invalid Input!',
            message='Please select your currencies.\nOr enter a valid value.')
    
    convert_btn.config(command=convert)
    
    


def rebuild():
    data.__init__()
    again_btn.grid_forget()
    check()
    
again_btn.config(command=rebuild)    
    
    

def check():
        
    if data.connect:
        build_app()
    else:
        mb.showerror(
            title='Failed to connect!',
            message='Could NOT connect to x-rates.com\nCheck internet connection!')
        
        
        again_btn.grid()
        
        
        
check()
root.mainloop()

import requests
from bs4 import BeautifulSoup as bs

class CurrencyData:
    
    def __init__(self):
        self.connect = True
        try: 
            source = requests.get('https://www.x-rates.com/table/?from=USD&amount=1').text
        except:
            self.connect = False
            
            
        if self.connect:    
            soup = bs(source, 'lxml')
            table = soup.find_all('tbody')
            mini_data = table[1].find_all('tr')
            self.currencies = ['US Dollar']
            from_usd_str = ['1']
            to_usd_str = ['1']
            for currency in mini_data:
                self.currencies.append(currency.td.text)
                rates = currency.find_all('a')
                from_usd_str.append(rates[0].text)
                to_usd_str.append(rates[1].text)
            
            self.from_usd = [float(x) for x in from_usd_str]
            self.to_usd = [float(i) for i in to_usd_str]

來自 pyinstaller github 問題: https://github.com/pyinstaller/pyinstaller/issues/5827

您可以使用 pyinstaller 的這個分支: https://github.com/rokm/pyinstaller/tree/macos_sdk_11_to_darwin20

通過克隆和運行安裝

sudo python setup.py install

然后相應地使用 pyinstaller

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM