簡體   English   中英

Tkinter - 添加滾動條時文本小部件會縮小

[英]Tkinter - Text widget shrinks when Scrollbar is added

我正在使用Python 2.7中的Tkinter開發一個簡單的測驗應用程序的GUI。 到目前為止,我已經開始設置我的框架。 我在一個名為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保持其原始大小?

您不希望將文本小部件用作滾動條的主控。 與任何其他窗口小部件一樣,如果您在文本窗口小部件中打包或網格化滾動條,則文本窗口小部件將縮小或展開以適合滾動條。 這是你問題的症結所在。

相反,創建一個單獨的框架(您已經在做),並使用該框架作為文本窗口小部件和滾動條的父框架。 如果您想要滾動條位於其中的外觀,請將文本小部件的邊框寬度設置為零,然后為包含的框架指定一個小邊框。

作為最終的可用性提示,我建議不要使窗口不可調整大小。 您的用戶可能比您更了解他們想要的窗口大小。 不要將控制權從用戶手中奪走。

這是(大致)我將如何實現您的代碼:

  • 我會使用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()

results_txtbx.grid(row = 3,column = 1, padx = 4) results_scrbr.grid(row = 3, column = 2)旁邊設置results_scrbr.grid(row = 3, column = 2) results_txtbx.grid(row = 3,column = 1, padx = 4) sticky ,因為窗口不可調整大小,我放下了padx,所以滾動條是更接近文字。

另外,要使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()

實施的解決方案:

我需要向應用程序添加更多小部件,因此我將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()

我將存儲在嵌套標簽中作為我自己的參考,當我需要將事物放在一起時,除非有某些原因應該避免。 在這里工作得很好。 感謝Bryan的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM