Python Tkinter-文本小部件在添加滚动条时收缩
我正在使用Python2.7中的Tkinter开发一个简单测验应用程序的GUI。 到目前为止,我已经开始建立我的框架。我在一个名为Python Tkinter-文本小部件在添加滚动条时收缩,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我正在使用Python2.7中的Tkinter开发一个简单测验应用程序的GUI。 到目前为止,我已经开始建立我的框架。我在一个名为results\u txtbx的文本小部件中放置了一个滚动条,用来上下滚动一个列表,记录玩家在每个问题上的表现。我一直在使用网格,因为它更容易管理 from Tkinter import * class Q_and_A: def __init__(self, master): frame = Frame(master) L
results\u txtbx
的文本小部件中放置了一个滚动条,用来上下滚动一个列表,记录玩家在每个问题上的表现。我一直在使用网格
,因为它更容易管理
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\u txtbx
会调整大小以适应滚动条。有没有办法使用grid
保持其原始大小?设置results\u scrbr.grid(row=3,column=2)
在results\u txtbx.grid(row=3,column=1,padx=4)
旁边,不需要设置sticky
,因为窗口无法调整大小,我降低了padx,所以滚动条更接近文本
另外,要使结果\u txtbx垂直滚动,请添加results\u scrbr.config(command=results\u 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()
您不希望使用文本小部件作为滚动条的主控。与任何其他小部件一样,如果在文本小部件中打包或网格化滚动条,文本小部件将收缩或扩展以适应滚动条。这就是你问题的症结所在 相反,创建一个单独的框架(您已经在这样做了),并将该框架用作文本小部件和滚动条的父级。如果想要滚动条位于内部的外观,请将文本小部件的borderwidth设置为零,然后为包含的框架提供一个小边框 作为最后的可用性提示,我建议不要使窗口不可调整大小。您的用户可能比您更了解他们想要的窗口大小。不要让你的用户失去控制权 下面是(大致)我将如何实现您的代码:
- 我会使用
而不是从Tkinter import*导入import Tkinter作为tk
,因为全局导入通常是个坏主意李>
- 我将把
作为Q_和_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()
我实施的解决方案: 我需要向应用程序添加更多小部件,因此我将
滚动条
和文本
小部件绑定到另一个标签上,并将其放在适当的列中,代码(为可读性而修剪)如下:
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()
我会将存储保存在嵌套标签中,作为我自己在需要将事物紧密分组时的参考,除非出于某种原因应该避免。在这里工作得很好。感谢布莱恩的建议。谢谢!为了做我需要的事情,我不得不对它进行一些修改。最后,我制作了另一个标签来存储框和滚动条。我将把我的代码张贴在答案中,以便比较。前几天我刚接了Tkinter,所以我还在想办法。你帮了我很多忙!