Python 如何在tkinter制作的窗口中添加滚动条 一个简单的问答游戏
我得到了这段代码,我需要滚动条,我试图搜索如何将它添加到stackoverflow(带有tix的ScrolledWindow…)上,但我仍然无法得到正常工作的东西。有人能帮我吗Python 如何在tkinter制作的窗口中添加滚动条 一个简单的问答游戏,python,tkinter,scrollbar,Python,Tkinter,Scrollbar,我得到了这段代码,我需要滚动条,我试图搜索如何将它添加到stackoverflow(带有tix的ScrolledWindow…)上,但我仍然无法得到正常工作的东西。有人能帮我吗 from tkinter import * from random import randint root = Tk() root.title("Quiz") root.geometry("400x300") class Window: def __init__(self, question, answe
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()
输出
使用
滚动框架
时,它可能看起来像这样
- 我将
重命名为窗口
,因为这样更有意义问题
- 我使用
和self.question
而不是self.answer
使它更具可读性self.text=[question,answer]
- 我将类和函数放在
之前,以使其更具可读性root=tk.tk()
- 我使用
而不是import-tkinter-as-tk
使其更具可读性from-tkinter-import*
问题
从滚动框架
获取内部框架,并用作LabelFrame
的父级。其他小部件使用labelframe
作为父项
顺便说一句:您有entry=entry(..).pack()
它将None
分配给entry
,因为pack()
/grid()
//place()
返回None
。我把pack()
放在下一行,现在我可以直接从Entry
中获取文本(不带StringVar
)
代码
将tkinter作为tk导入
从随机导入randint
#---班级---
类ScrolledFrame(tk.Frame):
定义初始值(自、父、垂直=真、水平=假):
super()。\uuuu init\uuuu(父级)
#内框帆布
self.\u canvas=tk.canvas(self)
self._canvas.grid(行=0,列=0,sticky='news')#已更改
#创建右滚动条并连接到画布Y
self.\u vertical\u bar=tk.Scrollbar(self,orient='vertical',command=self.\u canvas.yview)
如果垂直:
自垂直条形网格(行=0,列=1,粘性=ns')
self.\u canvas.configure(yscrollcommand=self.\u vertical\u bar.set)
#创建底部滚动条并连接到画布X
self.\u horizontal\u bar=tk.Scrollbar(self,orient='horizontal',command=self.\u canvas.xview)
如果水平:
self.\u水平\u条形网格(行=1,列=0,粘性=we')
self.\u canvas.configure(xscrollcommand=self.\u horizontal\u bar.set)
#小部件的内部框架
self.inner=tk.Frame(self.\u画布,bg='red')
self.\u window=self.\u canvas.create\u window((0,0),window=self.inner,anchor='nw')
#自动调整内部框架的大小
self.columnconfigure(0,权重=1)#已更改
self.rowconfigure(0,权重=1)#已更改
#配置更改时调整大小
self.internal.bind(“”,self.resize)
自我画布绑定(“”,自我框架宽度)
def帧_宽度(自身、事件):
#将内部框架调整为画布大小
画布宽度=event.width
self.\u canvas.itemconfig(self.\u窗口,宽度=画布宽度)
def调整大小(自我,事件=无):
self.\u canvas.configure(scrollregion=self.\u canvas.bbox('all'))
课堂问题:
定义初始(自我、家长、问题、答案):
self.parent=parent
self.question=问题
自我回答
self.create_widgets()
def get_输入(自身):
value=self.entry.get()
打印('值:',值)
如果值==self.answer:
打印(“Esatto.è”+自我回答)
self.label['text']=“Esatto”
def创建_小部件(自):
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\u输入)
self.button.pack()
#---梅因---
root=tk.tk()
根标题(“测验”)
根几何(“400x300”)
窗口=滚动帧(根)
pack(expand=True,fill='both')
对于范围(10)内的i:
1=randint(1,10)
二=randint(1,10)
问题(window.inner,“Quanto fa{}+{}?”。格式(一,二),str(一+二))
root.mainloop()
这里有一些示例如何使用Canvas
像这样滚动Frame
,非常感谢furas,我在尝试将滚动条添加到该窗口时感到非常困惑。
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()