使用 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),并使用 relxrelyrelheightrelwidth 以及 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()

请告诉我这是否有效!!