如何向使用 tkinter 制作的窗口添加滚动条 [英] How to add a scrollbar to window made with tkinter
问题描述
一个简单的问答游戏
我得到了这个代码,我需要滚动条,我试图搜索如何将它添加到 stackoverflow(带有 tix 的 ScrolledWindow...),但我仍然无法得到一些可以正常工作的东西.有人可以帮我吗?
from tkinter import *来自随机导入 randint根 = Tk()root.title("测验")root.geometry("400x300")类窗口:def __init__(self, question, answer):self.text = [问题,答案]self.createLabel()# self.createText()self.createEntry()self.createButton()defretrieve_input(self):# inputValue = self.textBox.get("1.0", "end-1c")# 打印(输入值)如果 self.mystring.get() == self.text[1]:print("Esatto.è" + self.text[1])self.left['text'] = "Esatto"def createLabel(self):self.labelframe = LabelFrame(root, text="Domanda:")self.labelframe.pack(fill="both", expand="yes")self.left = Label(self.labelframe, text=self.text[0])self.left.pack()def createText(self):self.textBox = 文字(高度=1)self.textBox.pack()def createEntry(self):self.mystring = StringVar()self.myentry = Entry(root, textvariable=self.mystring).pack()def createButton(self):self.but = Button(text="Click", command=self.retrieve_input)self.but.pack()对于范围内的我(10):一 = randint(1, 10)二 = randint(1, 10)Window("Quanto fa " + str(one) + "+" + str(two) + "?", str(one + two))root.mainloop()
<块引用>
输出
使用 ScrolledFrame
可以这样
- 我将
Window
重命名为Question
因为它更有意义 - 我使用
self.question
和self.answer
而不是self.text = [question, answer]
使其更具可读性. - 我将类和函数放在
root = tk.Tk()
之前,以使其更具可读性. - 我使用
import tkinter as tk
而不是from tkinter import *
使其更具可读性.
Question
从 ScrolledFrame
获取内部框架并用作 LabelFrame
的父级.其他小部件使用 labelframe
作为父级.
顺便说一句:你有 entry = Entry(..).pack()
将 None
分配给 entry
因为 pack()
/grid()
/place()
返回 None
.我把 pack()
放在下一行,现在我可以直接从 Entry
获取文本(没有 StringVar
)
代码
导入 tkinter 作为 tk来自随机导入 randint# --- 类 ---类 ScrolledFrame(tk.Frame):def __init__(自我,父母,垂直=真,水平=假):super().__init__(parent)# 内框的画布self._canvas = tk.Canvas(self)self._canvas.grid(row=0, column=0,sticky='news') # 改变# 创建右侧滚动条并连接到画布 Yself._vertical_bar = tk.Scrollbar(self, orient='vertical', command=self._canvas.yview)如果垂直:self._vertical_bar.grid(row=0, column=1,sticky='ns')self._canvas.configure(yscrollcommand=self._vertical_bar.set)# 创建底部滚动条并连接到画布 Xself._horizontal_bar = tk.Scrollbar(self, orient='horizontal', command=self._canvas.xview)如果水平:self._horizontal_bar.grid(row=1, column=0,sticky='we')self._canvas.configure(xscrollcommand=self._horizontal_bar.set)# 小部件的内部框架self.inner = tk.Frame(self._canvas, bg='red')self._window = self._canvas.create_window((0, 0), window=self.inner, anchor='nw')# 自动调整内部框架的大小self.columnconfigure(0, weight=1) # 改变了self.rowconfigure(0, weight=1) # 改变了# 当配置改变时调整大小self.inner.bind('', self.resize)self._canvas.bind('', self.frame_width)def frame_width(self, event):# 将内框调整为画布大小canvas_width = event.widthself._canvas.itemconfig(self._window, width = canvas_width)定义调整大小(自我,事件=无):self._canvas.configure(scrollregion=self._canvas.bbox('all'))课堂问题:def __init__(self, parent, question, answer):self.parent = 父母self.question = 问题self.answer = 答案self.create_widgets()def get_input(self):值 = self.entry.get()打印('值:',值)如果值 == self.answer:print("Esatto.è" + self.answer)self.label['text'] = "Esatto"def create_widgets(self):self.labelframe = tk.LabelFrame(self.parent, text="Domanda:")self.labelframe.pack(fill="both", expand=True)self.label = tk.Label(self.labelframe, text=self.question)self.label.pack(expand=True, fill='both')self.entry = tk.Entry(self.labelframe)self.entry.pack()self.button = tk.Button(self.labelframe, text="Click", command=self.get_input)self.button.pack()# - - 主要的 - -根 = tk.Tk()root.title("测验")root.geometry("400x300")窗口 = 滚动框架(根)window.pack(expand=True, fill='both')对于范围内的我(10):一 = randint(1, 10)二 = randint(1, 10)Question(window.inner, "Quanto fa {} + {} ?".format(one, two), str(one + two))root.mainloop()
A simple quiz game
I got this code and I need scrollbars, I tried to search how to add it on stackoverflow (ScrolledWindow with tix...) but I still can't get something that works properly. Could someone help me?
from tkinter import *
from random import randint
root = Tk()
root.title("Quiz")
root.geometry("400x300")
class Window:
def __init__(self, question, answer):
self.text = [question, answer]
self.createLabel()
# self.createText()
self.createEntry()
self.createButton()
def retrieve_input(self):
# inputValue = self.textBox.get("1.0", "end-1c")
# print(inputValue)
if self.mystring.get() == self.text[1]:
print("Esatto. è " + self.text[1])
self.left['text'] = "Esatto"
def createLabel(self):
self.labelframe = LabelFrame(root, text="Domanda:")
self.labelframe.pack(fill="both", expand="yes")
self.left = Label(self.labelframe, text=self.text[0])
self.left.pack()
def createText(self):
self.textBox = Text(height=1)
self.textBox.pack()
def createEntry(self):
self.mystring = StringVar()
self.myentry = Entry(root, textvariable=self.mystring).pack()
def createButton(self):
self.but = Button(text="Click", command=self.retrieve_input)
self.but.pack()
for i in range(10):
one = randint(1, 10)
two = randint(1, 10)
Window("Quanto fa " + str(one) + "+" + str(two) + "?", str(one + two))
root.mainloop()
output
With ScrolledFrame
it can look like this
- I renamed
Window
intoQuestion
because it makes more sense - I use
self.question
andself.answer
instead ofself.text = [question, answer]
to make it more readable. - I put classes and functions before
root = tk.Tk()
to make it more readable. - I use
import tkinter as tk
instead offrom tkinter import *
to make it more readable.
Question
gets inner frame from ScrolledFrame
and use as parent for LabelFrame
. Other widgets use labelframe
as parent.
BTW: you had entry = Entry(..).pack()
which assign None
to entry
because pack()
/grid()
/place()
returns None
. I put pack()
in next line and now I can get text directly from Entry
(without StringVar
)
Code
import tkinter as tk
from random import randint
# --- classes ---
class ScrolledFrame(tk.Frame):
def __init__(self, parent, vertical=True, horizontal=False):
super().__init__(parent)
# canvas for inner frame
self._canvas = tk.Canvas(self)
self._canvas.grid(row=0, column=0, sticky='news') # changed
# create right scrollbar and connect to canvas Y
self._vertical_bar = tk.Scrollbar(self, orient='vertical', command=self._canvas.yview)
if vertical:
self._vertical_bar.grid(row=0, column=1, sticky='ns')
self._canvas.configure(yscrollcommand=self._vertical_bar.set)
# create bottom scrollbar and connect to canvas X
self._horizontal_bar = tk.Scrollbar(self, orient='horizontal', command=self._canvas.xview)
if horizontal:
self._horizontal_bar.grid(row=1, column=0, sticky='we')
self._canvas.configure(xscrollcommand=self._horizontal_bar.set)
# inner frame for widgets
self.inner = tk.Frame(self._canvas, bg='red')
self._window = self._canvas.create_window((0, 0), window=self.inner, anchor='nw')
# autoresize inner frame
self.columnconfigure(0, weight=1) # changed
self.rowconfigure(0, weight=1) # changed
# resize when configure changed
self.inner.bind('<Configure>', self.resize)
self._canvas.bind('<Configure>', self.frame_width)
def frame_width(self, event):
# resize inner frame to canvas size
canvas_width = event.width
self._canvas.itemconfig(self._window, width = canvas_width)
def resize(self, event=None):
self._canvas.configure(scrollregion=self._canvas.bbox('all'))
class Question:
def __init__(self, parent, question, answer):
self.parent = parent
self.question = question
self.answer = answer
self.create_widgets()
def get_input(self):
value = self.entry.get()
print('value:', value)
if value == self.answer:
print("Esatto. è " + self.answer)
self.label['text'] = "Esatto"
def create_widgets(self):
self.labelframe = tk.LabelFrame(self.parent, text="Domanda:")
self.labelframe.pack(fill="both", expand=True)
self.label = tk.Label(self.labelframe, text=self.question)
self.label.pack(expand=True, fill='both')
self.entry = tk.Entry(self.labelframe)
self.entry.pack()
self.button = tk.Button(self.labelframe, text="Click", command=self.get_input)
self.button.pack()
# --- main ---
root = tk.Tk()
root.title("Quiz")
root.geometry("400x300")
window = ScrolledFrame(root)
window.pack(expand=True, fill='both')
for i in range(10):
one = randint(1, 10)
two = randint(1, 10)
Question(window.inner, "Quanto fa {} + {} ?".format(one, two), str(one + two))
root.mainloop()
这篇关于如何向使用 tkinter 制作的窗口添加滚动条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!