Python pack()方法不使用';不显示图形用户界面

Python pack()方法不使用';不显示图形用户界面,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我试图熟悉python GUI,因此为了熟悉它,我正在构建一个简单的计算器。 大部分都可以工作,但当我使用以下代码时,我正在尝试向文本显示小部件添加一个滚动条: self.scroll_bar = ttk.Scrollbar(self.master) self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y) # self.scroll_bar.grid(row=0, column=4) self.

我试图熟悉python GUI,因此为了熟悉它,我正在构建一个简单的计算器。 大部分都可以工作,但当我使用以下代码时,我正在尝试向文本显示小部件添加一个滚动条:

        self.scroll_bar = ttk.Scrollbar(self.master)
        self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
        # self.scroll_bar.grid(row=0, column=4)
        self.screen = tk.Text(self.master, height=5, width=30)
        # self.screen.grid(row=0, column=0, columnspan=4)
        self.screen.pack(side=tk.LEFT, fill=tk.BOTH)
        self.screen.configure(font=("Calibri", 20, "bold", "italic"),
                              foreground="black", background="whitesmoke")
        self.scroll_bar.config(command=self.screen.yview, orient=tk.VERTICAL)
        self.screen.config(yscrollcommand=self.scroll_bar.set)
GUI甚至没有打开,当我删除pack()行并使用网格时,它可以工作,但看起来非常不平衡

我的再现性完整代码为:

import tkinter as tk
from tkinter import ttk
import re

# the calculator gui text for the buttons
calculator_button_text = {
    'clear': 'C',
    'zero': '0',
    'one': '1',
    'two': '2',
    'three': '3',
    'four': '4',
    'five': '5',
    'six': '6',
    'seven': '7',
    'eight': '8',
    'nine': '9',
    'decimal': '.',
    'plus': '+',
    'minus': '-',
    'multiply': 'x',
    'divide': u"\u00F7",
    'equal': '=',
    'delete': u"\u232B"
}


class CalculatorApp(tk.Frame):
    ''' Main Calculator Class '''

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master
        self.user_in_list = []
        self.buttons_text = calculator_button_text
        self.equation = ""
        self.configure_gui()
        self.create_calc_widgets()
        # in order to change the button colors (mac)
        style = ttk.Style(self.master)
        style.theme_use('clam')
        style.configure('style.TButton', foreground="firebrick", background="darkgrey",
                        font=("Arial", 20, "bold", "italic"))
        style.map('TButton',
                  foreground=[('pressed', 'blue'),
                              ('active', 'darkgreen')],
                  background=[('pressed', 'dimgrey'),
                              ('active', 'grey')])

    def configure_gui(self):
        self.master.title("Calculator")
        self.master.configure(bg='black')

    def create_calc_widgets(self):
        self.create_input_field()
        self.create_buttons()

    def create_input_field(self):

        ## this work without scrollbar

        # self.screen = tk.Text(self.master, height=5, width=30)
        # self.screen.grid(row=0, column=0, columnspan=4, sticky=tk.W + tk.E)
        # self.screen.configure(font=("Calibri", 20, "bold", "italic"),
        #                       foreground="black", background="whitesmoke")

        self.scroll_bar = ttk.Scrollbar(self.master)
        self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
        # self.scroll_bar.grid(row=0, column=4)
        self.screen = tk.Text(self.master, height=5, width=30)
        # self.screen.grid(row=0, column=0, columnspan=4)
        self.screen.pack(side=tk.LEFT, fill=tk.BOTH)
        self.screen.configure(font=("Calibri", 20, "bold", "italic"),
                              foreground="black", background="whitesmoke")
        self.scroll_bar.config(command=self.screen.yview, orient=tk.VERTICAL)
        self.screen.config(yscrollcommand=self.scroll_bar.set)


    def create_buttons(self):
        button_col = 0
        button_row = 1
        text_in_row = ('C', '123d', '456-', '789x', '0.+/', '=')
        for row in text_in_row:
            for text in row:
                self.configure_button(text, button_row, button_col)
                button_col += 1
            button_col = 0
            button_row += 1

    def configure_button(self, txt, r, c):
        to_write = (txt == '=')
        # if txt in ('0123456789'):
        #     value = int(txt)

        if (txt == 'd'):
            txt = u"\u232B"
        elif (txt == '/'):
            txt = u"\u00F7"
        key = list(calculator_button_text.keys())[
            list(calculator_button_text.values()).index(txt)
        ]

        calculator_button_text[key] = ttk.Button(self.master, text=txt,
                                                 style='style.TButton',
                                                 command=lambda: self.click(txt, to_write))
        calculator_button_text[key].grid(row=r, column=c, ipady=10, ipadx=10)
        if (key=='clear'):
            self.configure_clear_button(key)
        elif (key=='equal'):
            self.configure_equal_button(key)

    def configure_clear_button(self, k):
        calculator_button_text[k].grid(columnspan=4, sticky=tk.W + tk.E)

    def configure_equal_button(self, k):
        calculator_button_text[k].grid(columnspan=4, sticky=tk.W + tk.E)

    def click(self, cmd, new_line):
        if (cmd != '='):
            self.display_on_screen(cmd, new_line)
        else:
            self.equation = re.sub(u"\u00F7", '/', self.equation)
            self.equation = re.sub("x", '*', self.equation)
            ans = str(eval(self.equation))
            self.display_on_screen(ans, new_line)
            self.equation = ""

    def display_on_screen(self, val, new_line=False):
        if (not new_line):
            self.screen.insert(tk.END, val)
            self.equation += str(val)
        else:
            self.screen.insert(tk.END, '\n')
            self.screen.insert(tk.END, val)
            self.screen.insert(tk.END, '\n')
            self.screen.yview('end')

    def clear_screen(self):
        # set equation to empty before deleting screen
        self.equation = ""
        self.screen.delete('1.0', tk.END)



if __name__ == '__main__':
    root = tk.Tk()
    calc_gui = CalculatorApp(root)
    # Make window fixed (cannot be resized)
    root.resizable(width=False, height=False)
    root.mainloop()
我要提到的是,我在MacOS Mojave上使用的是Python3.X,我对按钮的颜色有问题,所以最终我从
tk.Button()
改为
ttk.Button()


非常感谢您的帮助

事实上,几何体管理器不能将
打包
网格
混合在同一节中。因此,您必须选择一种模式来组织窗口的布局,或者将窗口拆分为两个框架,以便能够在一个框架中
打包
小部件,在另一个框架中打包
网格

您可以尝试以下方法:

self.screen = tk.Text(self.master, height=5, width=30)
self.screen.grid(row=0, column=0, columnspan=4, sticky='nswe')
self.scroll_bar = ttk.Scrollbar(self.master, command=self.screen.yview)
self.scroll_bar.grid(row=0, column=3, sticky='nse')

想法是发布一些重现问题的内容,以便更容易确定问题。修剪任何不相关的代码以隔离问题,有时甚至可以帮助您自己解决问题。@TigerhawkT3这是最上面的代码,但因为它是GUI的一部分,所以我添加了整个代码;如果我正在删除
pack()
GUI确实会显示,我在任何地方都看不到
calc\u GUI.pack()
调用。它也是一个小部件。@martineau我不熟悉这个小部件,它是做什么的,为什么我需要它?在接近末尾创建的
CalculatorApp
类的实例中。它是
tkinter.Frame
的一个子类。谢谢,另一个问题是,现在文本小部件不像之前的滚动条那样填充整个屏幕,有没有办法使其适合减去滚动条的整个大小?当然,您可以添加
sticky
参数来定义要填充的边框:
self.screen.grid(行=0,列=0,列span=4,sticky='nswe')
,就像北、南、东、西一样,效果很好;我会读更多关于粘性选项的内容!你的第一句话不太正确。你可以在整个窗口中混合使用
pack
grid
,你不必只使用一个或另一个。你可以将窗口分成多个部分,每个部分使用一个。@BryanOakle好的,但是在给定的情况下,您是否建议管理额外的帧来处理这种混合?