网格几何体经理

时间:2017-03-31 00:09:30

标签: python-3.x tkinter

我有这段代码:

from tkinter import *
from tkinter import ttk

class Application:
    def __init__(self, master):#Change to game class when combining code
        self.master = master#remove when combining code
        self.frame_Canvas = ttk.Frame(self.master, width = 600, height = 600)
        self.frame_Canvas.pack(side = 'left')
        self.frame_Canvas.pack_propagate(False)
        self.frame_Canvas.grid_propagate(False)
        self.hangman = Canvas(self.frame_Canvas, width = 600, height = 600,
                              background = 'white').pack()
        self.FullName = ttk.Label(self.frame_Canvas, text = "Full Name", background = 'white')#full name will be entered here
        self.FullName.config(font=("TkDefaultFont", 20))
        self.FullName.place(x = 10, y = 10)
        self.frame_Interact = ttk.Frame(self.master, width = 200, height = 600)
        self.frame_Interact.pack(side = 'right')
        self.frame_Interact.pack_propagate(False)
        self.frame_Interact.grid_propagate(False)
        self.QuestionLabel = ttk.Label(self.frame_Interact, text = "Question:")
        self.QuestionLabel.config(font=("TkDefaultFont", 20))
        self.QuestionLabel.grid(column = 0, row = 0)
        self.QuestionShow = Text(self.frame_Interact, height=1, width=8)#input question here 
        self.QuestionShow.config(font=("TkDefaultFont", 20))
        self.QuestionShow.grid(column = 0, row = 1)#FIX THE FORMATTING OF QUESTION, GRID CELL TO LEFT, NOT BIG ENOUGTH?

        self.AnswerEntry = ttk.Entry(self.frame_Interact, width = 10)#do later




def main():            

    root = Tk()
    root.wm_title("Hangman")
    Menu = Application(root)
    root.resizable(width=False, height=False)
    root.iconbitmap("windowicon.ico")
    root.mainloop()

if __name__ == "__main__": main()

我不知道为什么,但我的tkinter GUI右侧的Answer框和标签位于其框架的左侧。我希望它在中心。有没有人知道一种方法来解决它,或者到目前为止代码的任何改进。谢谢:))

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点,第一种方法是使用.pack()代替.grid(),因为pack非常易于使用,并且可以自动对齐。

所以你可以替换:

self.QuestionLabel.grid(column = 0, row = 0)
# and
self.QuestionShow.grid(column = 0, row = 1)

使用:

self.QuestionLabel.pack()
# and 
self.QuestionLShow.pack()

这种方式不建议用于您的情况,因为这将涉及将包和网格混合在一起,这可能会导致代码中的未来错误。

正如布莱恩·奥克利所说: 如果小部件共享同一个父级,它将立即导致错误。如果小部件具有不同的父级,它将不会导致问题。

你应该这样做:

from tkinter import *
from tkinter import ttk

class Application:
    def __init__(self, master):#Change to game class when combining code
        self.master = master#remove when combining code
        self.frame_Canvas = ttk.Frame(self.master, width = 600, height = 600)
        self.frame_Canvas.pack(side = 'left')
        self.frame_Canvas.pack_propagate(False)
        self.frame_Canvas.grid_propagate(False)
        self.hangman = Canvas(self.frame_Canvas, width = 600, height = 600,
                              background = 'white').pack()
        self.FullName = ttk.Label(self.frame_Canvas, text = "Full Name", background = 'white')#full name will be entered here
        self.FullName.config(font=("TkDefaultFont", 20))
        self.FullName.place(x = 10, y = 10)
        self.frame_Interact = ttk.Frame(self.master, width = 200, height = 600)
        self.frame_Interact.pack(side = 'right')
        self.frame_Interact.pack_propagate(False)
        self.frame_Interact.grid_propagate(False)
        Grid.columnconfigure(self.frame_Interact, 0, weight=1) # NOTE, THIS CHANGED
        self.QuestionLabel = ttk.Label(self.frame_Interact, text = "Question:")
        self.QuestionLabel.config(font=("TkDefaultFont", 20))
        self.QuestionLabel.grid(column = 0, row = 0)
        self.QuestionShow = Text(self.frame_Interact, height=1, width=8)
        self.QuestionShow.config(font=("TkDefaultFont", 20))
        self.QuestionShow.grid(column = 0, row = 1)

def main():            
    root = Tk()
    root.wm_title("Hangman")
    Menu = Application(root)
    root.resizable(width=False, height=False)
    root.iconbitmap("windowicon.ico")
    root.mainloop()

if __name__ == "__main__": 
    main()

通过添加Grid.columnconfigure(self.frame_Interact, 0, weight=1),它将帮助网格了解如何分配额外空间。这样标签就会试图占据整个栏目。如果您想知道,行也是如此,您可以添加Grid.rowconfigure(self.frame_Interact, 0, weight=1)以使小部件填满整行。

对于代码的一些改进,您应该更改此行:

self.hangman = Canvas(self.frame_Canvas, width = 600, height = 600,
                          background = 'white').pack()

# to
self.hangman = Canvas(self.frame_Canvas, width = 600, height = 600, background = 'white')
self.hangman.pack()

否则self.hangman将是None,就像在您的代码中一样。