使用 pyinstaller 创建可执行文件后,Tkinter 标签不适合 window
Tkinter Label Won't fit in the window after creating an executable with pyinstaller
我用 pyinstaller 创建了一个应用程序,但在某些将使用它的机器上,从 window 中删除了一些标签,此外还有两个文本框 see the image。我该如何解决这个问题?
在我的机器上它适合,在另一个不适合。
我认为问题出在 place() 方法上,但我不知道为什么它在一台计算机上可以工作,而在另一台计算机上却不行。
import tkinter as tk
from tkinter import ttk
import tkinter.font as font
import tkinter.messagebox
class Application(ttk.Frame):
def __init__(self, main_window):
super().__init__(main_window)
self.place(relwidth=1, relheight=1)
ttk.Style(main_window)
font.nametofont("TkTextFont").configure(size=12)
font.nametofont("TkDefaultFont").configure(size=12)
#Cabecalho
ttk.Label(self, text="Requisições", font='arial 18 bold').place(x=150, y=5)
ttk.Label(self, text="Desligamento", font='arial 18 bold').place(x=142, y=35)
#Informações usúario
ttk.Label(self, text="Usuário", font='arial 16 bold').place(x=10, y=100)
ttk.Label(self, text="Email:", font='arial 14').place(x=10, y=128)
ttk.Entry(self, width=20).place(x=85, y=128)
ttk.Label(self, text="Senha:", font='arial 14').place(x=10, y=158)
ttk.Entry(self, show="•").place(x=85, y=158)
#Lote
ttk.Label(self, text="Lote", font='arial 16 bold').place(x=10, y=190)
ttk.Label(self, text="Início:", font='arial 14').place(x=10, y=220)
ttk.Entry(self, width=10).place(x=85, y=220)
ttk.Label(self, text="Final:", font='arial 14').place(x=10, y=248)
ttk.Entry(self, width=10).place(x=85, y=250)
ttk.Label(self,text="dd/mm/aaaa",foreground='red',font='arial 10 italic').place(x=93, y=280)
ttk.Button(self,text= 'Download').place(x=210, y=215)
ttk.Button(self,text= 'Planilha').place(x=210, y=247)
#Informações
ttk.Label(self, text="Informações",font='arial 16 bold').place(x=10, y=310)
ttk.Button(self, text="Anexado").place(x=160, y=305)
ttk.Button(self, text="Pendente").place(x=280, y=305)
#Montagem listbox
frame = tk.Frame(main_window)
frame.pack()
frame.place(x=10,y=340)
self.listbox = tk.Listbox(frame,width=45, height=8, selectbackground='#808080', selectmode= 'extended')
self.listbox.pack(side="left", fill="y")
self.scrollbar = ttk.Scrollbar(frame, orient="vertical")
self.scrollbar.config(command=self.listbox.yview)
self.scrollbar.pack(side="right", fill="y")
self.listbox.config(yscrollcommand=self.scrollbar.set)
ttk.Button(self, text="Exibir").place(x=10, y=525)
ttk.Button(self, text="Aprovada").place(x=160, y=525)
ttk.Button(self, text="E mail Ponto").place(x=310, y=525)
ttk.Button(self, text="E mail Pendente", ).place(x=10, y=560)
# Informações da carta a ser exibida
ttk.Label(self,text="Requisição:" , font='arial 14 bold').place(x=450 , y=10)
ttk.Label(self,text="Nome:" , font='arial 14 bold').place(x=450 , y=40)
ttk.Label(self,text="Aviso Prévio:" , font='arial 14 bold').place(x=1000, y=40)
ttk.Label(self,text="Motivo:" , font='arial 14 bold').place(x=650 , y=10)
ttk.Label(self,text="Comunicação:" , font='arial 14 bold').place(x=1010, y=10)
ttk.Label(self,text="Desligamento:" , font='arial 14 bold').place(x=1300, y=10)
ttk.Label(self,text="Matrícula:" , font='arial 14 bold').place(x=1310, y=40)
ttk.Label(self,text="Salário:" , font='arial 14 bold').place(x=450 , y=70)
ttk.Label(self,text="Admissão:" , font='arial 14 bold').place(x=650 , y=70)
ttk.Label(self,text="Atualização:" , font='arial 14 bold').place(x=910, y=70)
ttk.Label(self,text="Cargo:" , font='arial 14 bold').place(x=1160, y=70)
#Montagem Janela Observação
ttk.Label(self,text="Observações", font='arial 14 bold').place(x=1210, y=100)
self.obs = tk.Text(self,height=10, width=42, fg="black", bg="white", font=("arial ", 12))
self.obs.place(x=1210, y=130)
#Montagem caixa de texto
ttk.Label(self, text="Carta Inconsistente", font='arial 14 bold').place(x=10, y=600)
self.texto = tk.Text(self, height=9, width=45, fg="#0911D0", bg="white", font=("arial ", 12), cursor="pencil")
self.texto.place(x=10, y=630)
# Botão Enviar email para carta náo ok
ttk.Button(self, text="Enviar E mail").place(x=10, y=800)
# Botão Sair
ttk.Button(self, text="Sair", command=self.quit).place(x=310, y=800)
def main():
main_window = tk.Tk()
main_window.title("Desligamentos")
main_window.state("zoomed")
app = Application(main_window)
app.mainloop()
if __name__=="__main__":
main()
您可以考虑这样的事情,固定 GUI 大小 top.resizable(0, 0)
,并使用 relx
、rely
、relheight
和 relwidth
以及 place()
,这些值是相对于父小部件的,所以如果你有嵌套的小部件(即标签框架内的文本框,那么标签框架的值是相对于顶部 window 和文本框的相对于标签框)。
try:
from tkinter import *
except ImportError:
from Tkinter import *
try:
import tkinter.ttk as ttk
py3 = 1
except ImportError:
import ttk
py3 = 0
def create_window():
global root, top
root = Tk() # creating a tkinter window, Tk is a class
top = MainFrame(root) # building the gui, so it's like MainFrame is inheriting the Tk class
root.mainloop() # infinite main loop
class MainFrame:
def __init__(self, top=None):
self.style = ttk.Style()
if sys.platform == "win32":
self.style.theme_use('winnative')
top.geometry("802x557+250+104")
top.minsize(120, 1)
top.maxsize(2970, 881)
top.resizable(0, 0) # fixing the GUI size
self.Labelframe = LabelFrame(top)
self.Labelframe.place(relx=0.4, rely=0.4, relheight=0.279, relwidth=0.264)
self.Labelframe.configure(text='''Test label''', background="#d9d9d9")
if __name__ == '__main__':
create_window()
只是一个建议,向 .place()
添加一个名为 anchor
的新参数。锚确定小部件的哪一部分到达指定的坐标。比如anchor = "center"
,relx和rely指定的坐标相对为0.5和0.5,那么widget的中间会去0.5,0.5。
有时锚点在 nw 或左上角,有时小部件会移到屏幕的一侧。
所以,将您的 anchor
设置为 "center",然后告诉我会发生什么。
希望这对您有所帮助!
编辑:
这将是您的代码:
import tkinter as tk
from tkinter import ttk
import tkinter.font as font
import tkinter.messagebox
class Application(ttk.Frame):
def __init__(self, main_window):
super().__init__(main_window)
self.place(relwidth=1, relheight=1, anchor = "center")
ttk.Style(main_window)
font.nametofont("TkTextFont").configure(size=12)
font.nametofont("TkDefaultFont").configure(size=12)
#Cabecalho
ttk.Label(self, text="Requisições", font='arial 18 bold').place(x=150, y=5, anchor = "center")
ttk.Label(self, text="Desligamento", font='arial 18 bold').place(x=142, y=35, anchor = "center")
#Informações usúario
ttk.Label(self, text="Usuário", font='arial 16 bold').place(x=10, y=100, anchor = "center")
ttk.Label(self, text="Email:", font='arial 14').place(x=10, y=128)
ttk.Entry(self, width=20).place(x=85, y=128, anchor = "center")
ttk.Label(self, text="Senha:", font='arial 14').place(x=10, y=158, anchor = "center")
ttk.Entry(self, show="•").place(x=85, y=158, anchor = "center")
#Lote
ttk.Label(self, text="Lote", font='arial 16 bold').place(x=10, y=190, anchor = "center")
ttk.Label(self, text="Início:", font='arial 14').place(x=10, y=22, anchor = "center")
ttk.Entry(self, width=10).place(x=85, y=220, anchor = "center")
ttk.Label(self, text="Final:", font='arial 14').place(x=10, y=248, anchor = "center")
ttk.Entry(self, width=10).place(x=85, y=250, anchor = "center")
ttk.Label(self,text="dd/mm/aaaa",foreground='red',font='arial 10 italic').place(x=93, y=280, anchor = "center")
ttk.Button(self,text= 'Download').place(x=210, y=215, anchor = "center")
ttk.Button(self,text= 'Planilha').place(x=210, y=247, anchor = "center")
#Informações
ttk.Label(self, text="Informações",font='arial 16 bold').place(x=10, y=310, anchor = "center")
ttk.Button(self, text="Anexado").place(x=160, y=305, anchor = "center")
ttk.Button(self, text="Pendente").place(x=280, y=305, anchor = "center")
#Montagem listbox
frame = tk.Frame(main_window)
frame.pack()
frame.place(x=10,y=340, anchor = "center")
self.listbox = tk.Listbox(frame,width=45, height=8, selectbackground='#808080', selectmode= 'extended')
self.listbox.pack(side="left", fill="y")
self.scrollbar = ttk.Scrollbar(frame, orient="vertical")
self.scrollbar.config(command=self.listbox.yview)
self.scrollbar.pack(side="right", fill="y")
self.listbox.config(yscrollcommand=self.scrollbar.set)
ttk.Button(self, text="Exibir").place(x=10, y=525, anchor = "center")
ttk.Button(self, text="Aprovada").place(x=160, y=525, anchor = "center")
ttk.Button(self, text="E mail Ponto").place(x=310, y=525, anchor = "center")
ttk.Button(self, text="E mail Pendente", ).place(x=10, y=560, anchor = "center")
# Informações da carta a ser exibida
ttk.Label(self,text="Requisição:" , font='arial 14 bold').place(x=450 , y=10, anchor = "center")
ttk.Label(self,text="Nome:" , font='arial 14 bold').place(x=450 , y=40, anchor = "center")
ttk.Label(self,text="Aviso Prévio:" , font='arial 14 bold').place(x=1000, y=40, anchor = "center")
ttk.Label(self,text="Motivo:" , font='arial 14 bold').place(x=650 , y=10, anchor = "center")
ttk.Label(self,text="Comunicação:" , font='arial 14 bold').place(x=1010, y=10, anchor = "center")
ttk.Label(self,text="Desligamento:" , font='arial 14 bold').place(x=1300, y=10, anchor = "center")
ttk.Label(self,text="Matrícula:" , font='arial 14 bold').place(x=1310, y=40, anchor = "center")
ttk.Label(self,text="Salário:" , font='arial 14 bold').place(x=450 , y=70, anchor = "center")
ttk.Label(self,text="Admissão:" , font='arial 14 bold').place(x=650 , y=70, anchor = "center")
ttk.Label(self,text="Atualização:" , font='arial 14 bold').place(x=910, y=70, anchor = "center")
ttk.Label(self,text="Cargo:" , font='arial 14 bold').place(x=1160, y=70, anchor = "center")
#Montagem Janela Observação
ttk.Label(self,text="Observações", font='arial 14 bold').place(x=1210, y=100, anchor = "center")
self.obs = tk.Text(self,height=10, width=42, fg="black", bg="white", font=("arial ", 12))
self.obs.place(x=1210, y=130, anchor = "center")
#Montagem caixa de texto
ttk.Label(self, text="Carta Inconsistente", font='arial 14 bold').place(x=10, y=600, anchor = "center")
self.texto = tk.Text(self, height=9, width=45, fg="#0911D0", bg="white", font=("arial ", 12), cursor="pencil")
self.texto.place(x=10, y=630, anchor = "center")
# Botão Enviar email para carta náo ok
ttk.Button(self, text="Enviar E mail").place(x=10, y=800, anchor = "center")
# Botão Sair
ttk.Button(self, text="Sair", command=self.quit).place(x=310, y=800, anchor = "center")
def main():
main_window = tk.Tk()
main_window.title("Desligamentos")
app = Application(main_window)
app.mainloop()
if __name__=="__main__":
main()
请告诉我这是否有效!!
我用 pyinstaller 创建了一个应用程序,但在某些将使用它的机器上,从 window 中删除了一些标签,此外还有两个文本框 see the image。我该如何解决这个问题? 在我的机器上它适合,在另一个不适合。 我认为问题出在 place() 方法上,但我不知道为什么它在一台计算机上可以工作,而在另一台计算机上却不行。
import tkinter as tk
from tkinter import ttk
import tkinter.font as font
import tkinter.messagebox
class Application(ttk.Frame):
def __init__(self, main_window):
super().__init__(main_window)
self.place(relwidth=1, relheight=1)
ttk.Style(main_window)
font.nametofont("TkTextFont").configure(size=12)
font.nametofont("TkDefaultFont").configure(size=12)
#Cabecalho
ttk.Label(self, text="Requisições", font='arial 18 bold').place(x=150, y=5)
ttk.Label(self, text="Desligamento", font='arial 18 bold').place(x=142, y=35)
#Informações usúario
ttk.Label(self, text="Usuário", font='arial 16 bold').place(x=10, y=100)
ttk.Label(self, text="Email:", font='arial 14').place(x=10, y=128)
ttk.Entry(self, width=20).place(x=85, y=128)
ttk.Label(self, text="Senha:", font='arial 14').place(x=10, y=158)
ttk.Entry(self, show="•").place(x=85, y=158)
#Lote
ttk.Label(self, text="Lote", font='arial 16 bold').place(x=10, y=190)
ttk.Label(self, text="Início:", font='arial 14').place(x=10, y=220)
ttk.Entry(self, width=10).place(x=85, y=220)
ttk.Label(self, text="Final:", font='arial 14').place(x=10, y=248)
ttk.Entry(self, width=10).place(x=85, y=250)
ttk.Label(self,text="dd/mm/aaaa",foreground='red',font='arial 10 italic').place(x=93, y=280)
ttk.Button(self,text= 'Download').place(x=210, y=215)
ttk.Button(self,text= 'Planilha').place(x=210, y=247)
#Informações
ttk.Label(self, text="Informações",font='arial 16 bold').place(x=10, y=310)
ttk.Button(self, text="Anexado").place(x=160, y=305)
ttk.Button(self, text="Pendente").place(x=280, y=305)
#Montagem listbox
frame = tk.Frame(main_window)
frame.pack()
frame.place(x=10,y=340)
self.listbox = tk.Listbox(frame,width=45, height=8, selectbackground='#808080', selectmode= 'extended')
self.listbox.pack(side="left", fill="y")
self.scrollbar = ttk.Scrollbar(frame, orient="vertical")
self.scrollbar.config(command=self.listbox.yview)
self.scrollbar.pack(side="right", fill="y")
self.listbox.config(yscrollcommand=self.scrollbar.set)
ttk.Button(self, text="Exibir").place(x=10, y=525)
ttk.Button(self, text="Aprovada").place(x=160, y=525)
ttk.Button(self, text="E mail Ponto").place(x=310, y=525)
ttk.Button(self, text="E mail Pendente", ).place(x=10, y=560)
# Informações da carta a ser exibida
ttk.Label(self,text="Requisição:" , font='arial 14 bold').place(x=450 , y=10)
ttk.Label(self,text="Nome:" , font='arial 14 bold').place(x=450 , y=40)
ttk.Label(self,text="Aviso Prévio:" , font='arial 14 bold').place(x=1000, y=40)
ttk.Label(self,text="Motivo:" , font='arial 14 bold').place(x=650 , y=10)
ttk.Label(self,text="Comunicação:" , font='arial 14 bold').place(x=1010, y=10)
ttk.Label(self,text="Desligamento:" , font='arial 14 bold').place(x=1300, y=10)
ttk.Label(self,text="Matrícula:" , font='arial 14 bold').place(x=1310, y=40)
ttk.Label(self,text="Salário:" , font='arial 14 bold').place(x=450 , y=70)
ttk.Label(self,text="Admissão:" , font='arial 14 bold').place(x=650 , y=70)
ttk.Label(self,text="Atualização:" , font='arial 14 bold').place(x=910, y=70)
ttk.Label(self,text="Cargo:" , font='arial 14 bold').place(x=1160, y=70)
#Montagem Janela Observação
ttk.Label(self,text="Observações", font='arial 14 bold').place(x=1210, y=100)
self.obs = tk.Text(self,height=10, width=42, fg="black", bg="white", font=("arial ", 12))
self.obs.place(x=1210, y=130)
#Montagem caixa de texto
ttk.Label(self, text="Carta Inconsistente", font='arial 14 bold').place(x=10, y=600)
self.texto = tk.Text(self, height=9, width=45, fg="#0911D0", bg="white", font=("arial ", 12), cursor="pencil")
self.texto.place(x=10, y=630)
# Botão Enviar email para carta náo ok
ttk.Button(self, text="Enviar E mail").place(x=10, y=800)
# Botão Sair
ttk.Button(self, text="Sair", command=self.quit).place(x=310, y=800)
def main():
main_window = tk.Tk()
main_window.title("Desligamentos")
main_window.state("zoomed")
app = Application(main_window)
app.mainloop()
if __name__=="__main__":
main()
您可以考虑这样的事情,固定 GUI 大小 top.resizable(0, 0)
,并使用 relx
、rely
、relheight
和 relwidth
以及 place()
,这些值是相对于父小部件的,所以如果你有嵌套的小部件(即标签框架内的文本框,那么标签框架的值是相对于顶部 window 和文本框的相对于标签框)。
try:
from tkinter import *
except ImportError:
from Tkinter import *
try:
import tkinter.ttk as ttk
py3 = 1
except ImportError:
import ttk
py3 = 0
def create_window():
global root, top
root = Tk() # creating a tkinter window, Tk is a class
top = MainFrame(root) # building the gui, so it's like MainFrame is inheriting the Tk class
root.mainloop() # infinite main loop
class MainFrame:
def __init__(self, top=None):
self.style = ttk.Style()
if sys.platform == "win32":
self.style.theme_use('winnative')
top.geometry("802x557+250+104")
top.minsize(120, 1)
top.maxsize(2970, 881)
top.resizable(0, 0) # fixing the GUI size
self.Labelframe = LabelFrame(top)
self.Labelframe.place(relx=0.4, rely=0.4, relheight=0.279, relwidth=0.264)
self.Labelframe.configure(text='''Test label''', background="#d9d9d9")
if __name__ == '__main__':
create_window()
只是一个建议,向 .place()
添加一个名为 anchor
的新参数。锚确定小部件的哪一部分到达指定的坐标。比如anchor = "center"
,relx和rely指定的坐标相对为0.5和0.5,那么widget的中间会去0.5,0.5。
有时锚点在 nw 或左上角,有时小部件会移到屏幕的一侧。
所以,将您的 anchor
设置为 "center",然后告诉我会发生什么。
希望这对您有所帮助!
编辑:
这将是您的代码:
import tkinter as tk
from tkinter import ttk
import tkinter.font as font
import tkinter.messagebox
class Application(ttk.Frame):
def __init__(self, main_window):
super().__init__(main_window)
self.place(relwidth=1, relheight=1, anchor = "center")
ttk.Style(main_window)
font.nametofont("TkTextFont").configure(size=12)
font.nametofont("TkDefaultFont").configure(size=12)
#Cabecalho
ttk.Label(self, text="Requisições", font='arial 18 bold').place(x=150, y=5, anchor = "center")
ttk.Label(self, text="Desligamento", font='arial 18 bold').place(x=142, y=35, anchor = "center")
#Informações usúario
ttk.Label(self, text="Usuário", font='arial 16 bold').place(x=10, y=100, anchor = "center")
ttk.Label(self, text="Email:", font='arial 14').place(x=10, y=128)
ttk.Entry(self, width=20).place(x=85, y=128, anchor = "center")
ttk.Label(self, text="Senha:", font='arial 14').place(x=10, y=158, anchor = "center")
ttk.Entry(self, show="•").place(x=85, y=158, anchor = "center")
#Lote
ttk.Label(self, text="Lote", font='arial 16 bold').place(x=10, y=190, anchor = "center")
ttk.Label(self, text="Início:", font='arial 14').place(x=10, y=22, anchor = "center")
ttk.Entry(self, width=10).place(x=85, y=220, anchor = "center")
ttk.Label(self, text="Final:", font='arial 14').place(x=10, y=248, anchor = "center")
ttk.Entry(self, width=10).place(x=85, y=250, anchor = "center")
ttk.Label(self,text="dd/mm/aaaa",foreground='red',font='arial 10 italic').place(x=93, y=280, anchor = "center")
ttk.Button(self,text= 'Download').place(x=210, y=215, anchor = "center")
ttk.Button(self,text= 'Planilha').place(x=210, y=247, anchor = "center")
#Informações
ttk.Label(self, text="Informações",font='arial 16 bold').place(x=10, y=310, anchor = "center")
ttk.Button(self, text="Anexado").place(x=160, y=305, anchor = "center")
ttk.Button(self, text="Pendente").place(x=280, y=305, anchor = "center")
#Montagem listbox
frame = tk.Frame(main_window)
frame.pack()
frame.place(x=10,y=340, anchor = "center")
self.listbox = tk.Listbox(frame,width=45, height=8, selectbackground='#808080', selectmode= 'extended')
self.listbox.pack(side="left", fill="y")
self.scrollbar = ttk.Scrollbar(frame, orient="vertical")
self.scrollbar.config(command=self.listbox.yview)
self.scrollbar.pack(side="right", fill="y")
self.listbox.config(yscrollcommand=self.scrollbar.set)
ttk.Button(self, text="Exibir").place(x=10, y=525, anchor = "center")
ttk.Button(self, text="Aprovada").place(x=160, y=525, anchor = "center")
ttk.Button(self, text="E mail Ponto").place(x=310, y=525, anchor = "center")
ttk.Button(self, text="E mail Pendente", ).place(x=10, y=560, anchor = "center")
# Informações da carta a ser exibida
ttk.Label(self,text="Requisição:" , font='arial 14 bold').place(x=450 , y=10, anchor = "center")
ttk.Label(self,text="Nome:" , font='arial 14 bold').place(x=450 , y=40, anchor = "center")
ttk.Label(self,text="Aviso Prévio:" , font='arial 14 bold').place(x=1000, y=40, anchor = "center")
ttk.Label(self,text="Motivo:" , font='arial 14 bold').place(x=650 , y=10, anchor = "center")
ttk.Label(self,text="Comunicação:" , font='arial 14 bold').place(x=1010, y=10, anchor = "center")
ttk.Label(self,text="Desligamento:" , font='arial 14 bold').place(x=1300, y=10, anchor = "center")
ttk.Label(self,text="Matrícula:" , font='arial 14 bold').place(x=1310, y=40, anchor = "center")
ttk.Label(self,text="Salário:" , font='arial 14 bold').place(x=450 , y=70, anchor = "center")
ttk.Label(self,text="Admissão:" , font='arial 14 bold').place(x=650 , y=70, anchor = "center")
ttk.Label(self,text="Atualização:" , font='arial 14 bold').place(x=910, y=70, anchor = "center")
ttk.Label(self,text="Cargo:" , font='arial 14 bold').place(x=1160, y=70, anchor = "center")
#Montagem Janela Observação
ttk.Label(self,text="Observações", font='arial 14 bold').place(x=1210, y=100, anchor = "center")
self.obs = tk.Text(self,height=10, width=42, fg="black", bg="white", font=("arial ", 12))
self.obs.place(x=1210, y=130, anchor = "center")
#Montagem caixa de texto
ttk.Label(self, text="Carta Inconsistente", font='arial 14 bold').place(x=10, y=600, anchor = "center")
self.texto = tk.Text(self, height=9, width=45, fg="#0911D0", bg="white", font=("arial ", 12), cursor="pencil")
self.texto.place(x=10, y=630, anchor = "center")
# Botão Enviar email para carta náo ok
ttk.Button(self, text="Enviar E mail").place(x=10, y=800, anchor = "center")
# Botão Sair
ttk.Button(self, text="Sair", command=self.quit).place(x=310, y=800, anchor = "center")
def main():
main_window = tk.Tk()
main_window.title("Desligamentos")
app = Application(main_window)
app.mainloop()
if __name__=="__main__":
main()
请告诉我这是否有效!!