【问题标题】:tkinter GUI blacked out screen after PyInstallerPyInstaller 后 tkinter GUI 黑屏
【发布时间】:2021-08-07 04:33:41
【问题描述】:

在我的脚本上使用 PyInstaller 后,包含 tk GUI,输出 GUI 将显示黑屏。但是,我所有的小部件都在工作。当我尝试将鼠标悬停在屏幕上并尝试按下 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]

【问题讨论】:

  • 所以它全是黑色的,但仍然有可以交互的小部件?好的,有趣的是,首先你可以展示你的实际代码(我假设它可以在没有所有东西都是黑色的情况下工作),以文本格式发布在这里。其次,我想如果你告诉你是把它做成一个文件还是一个目录会很有帮助?
  • 您是否在控制台/终端中运行它以查看错误消息?
  • @Matiiss ,是的。当我运行代码时一切正常。我做了一个文件。我的猜测是因为我使用了外部图像!我会尽快编辑帖子并添加代码。
  • @furas ,是的,它工作正常,没有错误。
  • 好的,也许尝试创建一个单目录

标签: python user-interface tkinter pyinstaller


【解决方案1】:

来自 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

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2016-05-17
    • 2021-07-23
    • 2020-10-27
    • 2021-10-12
    • 2021-07-25
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多