2

我正在使用 Python 2.7 中的 Tkinter 为一个简单的测验应用程序开发 GUI。到目前为止,我已经开始设置我的框架。我在一个名为 Text 的小部件中放置了一个滚动条,用于results_txtbx上下滚动一个列表,记录玩家在每个问题上的表现。我一直在使用grid它,因为它对我来说更容易管理。

from Tkinter import *

class Q_and_A:

    def __init__(self, master):
        frame = Frame(master)

        Label(master).grid(row = 4)

        results_txtbx = Text(master)
        results_scrbr = Scrollbar(results_txtbx)
        results_scrbr.grid(sticky = NS + E)

        results_txtbx.config(width = 20, height = 4, wrap = NONE, yscrollcommand = results_scrbr.set)
        results_txtbx.grid(row = 3, column = 1, padx = 12, sticky = W)



root = Tk()
root.wm_title("Question and Answer")
root.resizable(0, 0)

app = Q_and_A(root)
root.mainloop()

发生的情况是,当它运行时,会results_txtbx调整大小以适应滚动条。有没有办法让它保持原来的大小使用grid

4

3 回答 3

5

您不想将文本小部件用作滚动条的主控件。与任何其他小部件一样,如果您在文本小部件中打包或网格化滚动条,则文本小部件将缩小或扩展以适应滚动条。这就是你问题的症结所在。

相反,创建一个单独的框架(您已经在做),并将该框架用作文本小部件和滚动条的父级。如果您想要滚动条在里面的外观,请将文本小部件的边框宽度设置为零,然后给包含框架一个小边框。

作为最后的可用性提示,我建议不要使窗口不可调整大小。您的用户可能比您更清楚他们想要什么大小的窗口。不要将控制权从您的用户手中夺走。

这是(大致)我将如何实现您的代码:

  • 我会使用import Tkinter as tk而不是from Tkinter import *因为全球进口通常是一个坏主意。
  • 我会创建Q_and_A一个子类,tk.Frame以便它可以被视为一个小部件。
  • 我会让整个窗口调整大小
  • 我会将小部件创建与小部件布局分开,因此我所有的布局选项都在一个地方。这使得编写和维护更容易,IMO。
  • 正如我的回答中提到的,我会将文本和滚动条小部件放在一个框架内

这是最终结果:

import Tkinter as tk

class Q_and_A(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master, borderwidth=1, relief="sunken")
        self.label = tk.Label(self)
        self.results_txtbx = tk.Text(self, width=20, height=4, wrap="none",
                                     borderwidth=0, highlightthickness=0)
        self.results_scrbr = tk.Scrollbar(self, orient="vertical", 
                                          command=self.results_txtbx.yview)
        self.results_txtbx.configure(yscrollcommand=self.results_scrbr.set)

        self.label.grid(row=1, columnspan=2)
        self.results_scrbr.grid(row=0, column=1, sticky="ns")
        self.results_txtbx.grid(row=0, column=0, sticky="nsew")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

root = tk.Tk()
root.wm_title("Question And Answer")

app = Q_and_A(root)
app.pack(side="top", fill="both", expand=True)
root.mainloop()
于 2013-05-29T10:50:33.330 回答
1

不需要设置在 ,results_scrbr.grid(row = 3, column = 2)旁边results_txtbx.grid(row = 3,column = 1, padx = 4),因为窗口不可调整大小,并且我降低了 padx 以便滚动条更接近文本。sticky

还要使 results_txtbx 垂直滚动,添加results_scrbr.config(command=results_txtbx.yview)

这是一个工作代码...

from Tkinter import *

class Q_and_A:

    def __init__(self, master):
        frame = Frame(master)

        Label(master).grid(row = 4)

        results_txtbx = Text(master)
        results_scrbr = Scrollbar(master)
        results_scrbr.grid(row = 3, column = 2)
        results_scrbr.config(command=results_txtbx.yview)


        results_txtbx.config(width = 20, height = 4,
                             wrap = NONE, yscrollcommand = results_scrbr.set)
        results_txtbx.grid(row = 3, column = 1, padx = 4)



root = Tk()
root.wm_title("Question and Answer")
root.resizable(0, 0)

app = Q_and_A(root)
root.mainloop()
于 2013-05-29T07:59:57.830 回答
0

我实施的解决方案:

我需要向应用程序添加更多小部件,因此我将ScrollbarText小部件绑定到另一个标签并将其放在正确的列中,代码(为便于阅读而修剪)如下:

import Tkinter as tk

class Q_and_A(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)

        self.label = tk.Label(self)

        #Set up menu strip

        self.main_menu = tk.Menu(self)
        self.file_menu = tk.Menu(self.main_menu, tearoff = 0)

        self.file_menu.add_command(label = "Exit", command = self.quit)

        self.main_menu.add_cascade(label = "File", menu = self.file_menu)

        self.master.config(menu = self.main_menu)

        #Set up labels

        self.question_lbl = tk.Label(self, text = "Question #: ", padx = 12, pady = 6)
        self.question_lbl.grid(row = 0, sticky = "w")

        tk.Label(self, text = "Hint: ").grid(row = 1, sticky = "w", padx = 12, pady = 6)
        tk.Label(self, text = "Answer: ").grid(row = 2, sticky = "w", padx = 12, pady = 6)
        tk.Label(self, text = "Results: ").grid(row = 3, sticky = "nw", padx = 12, pady = 6)

        tk.Label(self).grid(row = 4)

        #Set up textboxes
        self.question_txtbx = tk.Entry(self)
        self.question_txtbx.config(width = 60)
        self.question_txtbx.grid(row = 0, column = 1, padx = 12, columnspan = 3, sticky = "w")
        self.help_txtbx = tk.Entry(self)
        self.help_txtbx.config(width = 40)
        self.help_txtbx.grid(row = 1, column = 1, columnspan = 2, padx = 12, sticky = "w")
        self.answer_txtbx = tk.Entry(self)
        self.answer_txtbx.config(width = 40)
        self.answer_txtbx.grid(row = 2, column = 1, columnspan = 2, padx = 12, sticky = "w")

        self.results_label = tk.Label(self)

        self.results_txtbx = tk.Text(self.results_label, width = 10, height = 4, wrap = "none", borderwidth = 1, highlightthickness = 1)
        self.results_scrbr = tk.Scrollbar(self.results_label, orient = "vertical", command = self.results_txtbx.yview)
        self.results_txtbx.configure(yscrollcommand = self.results_scrbr.set)

        self.label.grid(row = 1)
        self.results_label.grid(row = 3, column = 1, padx = 11, sticky = "w")
        self.results_scrbr.grid(row = 0, column = 1, sticky = "nse")
        self.results_txtbx.grid(row = 0, column = 0, sticky = "w")

root = tk.Tk()
root.wm_title("Question and Answer")
#A note: The window is non-resizable due to project specifications.
root.resizable(0, 0)

app = Q_and_A(root)
app.pack(side = "top", fill = "both")
root.mainloop()

当我需要将事物组合在一起时,我会将存储在嵌套标签中作为自己的参考,除非有某些原因应该避免它。在这里工作得很好。感谢布莱恩的建议。

于 2013-05-30T02:03:56.693 回答