Я создаю графический интерфейс для скрипта. Сначала я разработал пустой GUI (код, показанный ниже). Изображения не показывались, но затем я искал Google и понял, что ссылки на изображение собирают мусор и фиксируют его по этой ссылке (http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm). Затем я сделал изображение глобальной переменной в GUI-скрипте, и это тоже сработало.Почему мой python tkinter GUI не показывает изображения при импорте в другой скрипт?
Этот файл называется GUI.py:
import Tkinter as tk
import ttk
import tkMessageBox
import time
from PIL import ImageTk, Image
class StartPage(tk.Frame):
def __init__(self, master, text, height, width, *args, **kwargs):
global logo
tk.Frame.__init__(self, *args, borderwidth=20, **kwargs)
self.height = height
self.width = width
# path = "test.jpg"
# self.img = ImageTk.PhotoImage(Image.open(path))
logo = ImageTk.PhotoImage(Image.open('test.jpg'))
self.picture = tk.Label(self, image=logo)
#self.picture.image = img
self.picture.pack(side = "bottom", fill = "both", expand = "yes")
label = tk.Label(self, text='Waiting', font=("Helvetica bold", 24)).pack()
label = tk.Label(self, text='Click START Button', font=("Helvetica", 16)).pack(expand=True)
button = tk.Button(self, text=text, font=('Helvetica', 20),
command=lambda: self.callback())
button.pack(side="top", expand=True)
root.update()
def onlift(self):
root.geometry('{}x{}'.format(self.width, self.height))
self.lift()
class TestPage(tk.Frame):
def __init__(self, master, text, height, width, *args, **kwargs):
tk.Frame.__init__(self, *args, borderwidth=20, **kwargs)
self.height = height
self.width = width
self.state = tk.StringVar()
self.label = tk.Label(self, textvariable=self.state, font=("Helvetica", 16)).pack()
self.progress = ttk.Progressbar(self, orient='horizontal', length=1000, mode='determinate')
self.progress.pack()
path = 'connect.jpg'
img = ImageTk.PhotoImage(Image.open(path))
self.picture = tk.Label(self, text='test image', image=img)
self.picture.image = img
self.picture.pack()
root.update()
def onlift(self):
global p1
root.geometry('{}x{}'.format(self.width, self.height))
self.lift()
self.progress["value"] = 0
self.state.set('Running...')
root.update()
time.sleep(1)
self.progress["value"] = 50
root.update()
confirm = tkMessageBox.askyesno(message='ON?', icon='question', title='Confirmation')
#print confirm
if confirm:
print 'Confirmed'
self.progress["value"] = 100
self.state.set('PASSED!')
root.update()
tkMessageBox.showinfo(title='Test Passed',message='PASS')
self.label
else:
self.state.set('Test FAILED!')
root.update()
tkMessageBox.showinfo(title='Test Failed',message='FAIL',icon='warning')
p1.onlift()
class App(tk.Frame):
def __init__(self, *args, **kwargs):
global p1
tk.Frame.__init__(self, *args, **kwargs)
p1 = StartPage(self, 'START', height=root.winfo_screenheight(), width=root.winfo_screenwidth())
p2 = TestPage(self, 'blank', height=root.winfo_screenheight(), width=root.winfo_screenwidth())
p1.callback = p2.onlift
p2.callback = p1.onlift
p1.place(x=0, y=0, relwidth=1, relheight=1)
p2.place(x=0, y=0, relwidth=1, relheight=1)
p1.onlift()
global p1
global p2
global logo
global connectimg
root = tk.Tk()
root.title('GUI')
app = App(root)
root.update()
Моя проблема теперь, когда я импортировать этот GUI.py в мой фактический тестовый сценарий я снова потерять изображения. Я попытался загрузить изображения в этом скрипте и передать ссылку на графический интерфейс, но это не сработало.
import GUI
Это, как я могу изменить текст метки и значение прогресса бара от моего сценария:
GUI.p2.state.set('Running')
GUI.p2.progress["value"] = 50
GUI.root.update()
Если я запускаю графический интерфейс с основным циклом() сама по себе изображениям отображаются в порядке. Когда я запускаю его как импортированный модуль из второго скрипта, он не отображает изображения. Что я делаю не так?
показать тестовый скрипт, чтобы мы могли запускать весь код. – furas
Создает ли ваш скрипт сценарий тоже виджеты? Вы можете использовать только один экземпляр 'Tk' за один раз. –
@furas Извините, не могу передать этот код ... – aroushan