【发布时间】: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