self.canvas = tk.Canvas(self.frame, width=1077, height=226,bg='Gold') self.scrollbar = tk.Scrollbar(self.frame, orient='vertical', command=self.canvas.yview) self.canvas.config(yscrollcommand=self.scrollbar.set) self.scrollbar.pack(side='right', fill='y') self.canvas.pack(side='left', fill='both', expand=True)为什么滚轮不能鼠标滑动
时间: 2023-12-03 11:42:08 浏览: 33
你需要在Canvas上绑定鼠标滚轮事件,并且在事件处理函数中更新Canvas的视图。可以尝试以下代码:
```
self.canvas.bind('<MouseWheel>', lambda event: self.canvas.yview_scroll(-1 * int(event.delta / 120), 'units'))
self.canvas.bind('<Button-4>', lambda event: self.canvas.yview_scroll(-1, 'units'))
self.canvas.bind('<Button-5>', lambda event: self.canvas.yview_scroll(1, 'units'))
```
这里使用lambda表达式绑定鼠标滚轮事件,第一个参数是事件类型,第二个参数是事件处理函数。`<MouseWheel>`是鼠标滚轮事件,在Windows系统下可以触发,而`<Button-4>`和`<Button-5>`是Linux和Mac系统下的鼠标滚轮事件。在事件处理函数中,使用`yview_scroll()`方法更新Canvas的视图。
注意:使用lambda表达式的目的是为了把事件对象传递给事件处理函数,而不是直接调用事件处理函数。因为事件对象包含了鼠标滚轮的滚动距离等信息,需要在事件处理函数中使用。
相关问题
import tkinter as tk class Three_layout(): def __init__(self, top): self.top = top self.frame = tk.Frame(self.top, bg='Gold', width=1100, height=234, highlightthickness=2, highlightbackground='Black') self.frame.place(x=0, y=670) self.canvas = tk.Canvas(self.frame, width=1077, height=226, bg='Gold') self.canvas.pack(side='left', fill='both', expand=True) self.scrollbar = tk.Scrollbar(self.frame, command=self.canvas.yview, orient=tk.VERTICAL) self.scrollbar.pack(side='right', fill='y') self.canvas.configure(yscrollcommand=self.scrollbar.set) self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) self.button_frame = tk.Frame(self.canvas, bg='Yellow') self.canvas.create_window((0, 0), window=self.button_frame, anchor="nw") self.Content() self.Text_Add() def Content(self): self.text = tk.Text(self.button_frame, width=1077) self.text.pack(side='left', fill='both', expand=True) self.text.insert('end', f'\n') self.text.config(state='disabled') self.button_frame.update_idletasks() self.canvas.configure(scrollregion=self.canvas.bbox("all")) def Text_Add(self): self.text.insert('end', "Hello, world!")为什么没有显示hello,world
在你的代码中,你在`Text_Add()`方法中调用了`insert()`方法,但是你没有将`state`设置为`normal`,这会导致你无法在`Text`控件中插入文本。所以你需要在调用`insert()`方法之前,将`state`设置为`normal`,插入完文本之后再将`state`设置为`disabled`,以保持`Text`控件的只读状态。修改后的代码如下:
```
import tkinter as tk
class Three_layout():
def __init__(self, top):
self.top = top
self.frame = tk.Frame(self.top, bg='Gold', width=1100,
height=234, highlightthickness=2, highlightbackground='Black')
self.frame.place(x=0, y=670)
self.canvas = tk.Canvas(self.frame, width=1077, height=226, bg='Gold')
self.canvas.pack(side='left', fill='both', expand=True)
self.scrollbar = tk.Scrollbar(self.frame, command=self.canvas.yview, orient=tk.VERTICAL)
self.scrollbar.pack(side='right', fill='y')
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
self.button_frame = tk.Frame(self.canvas, bg='Yellow')
self.canvas.create_window((0, 0), window=self.button_frame, anchor="nw")
self.Content()
self.Text_Add()
def Content(self):
self.text = tk.Text(self.button_frame, width=1077)
self.text.pack(side='left', fill='both', expand=True)
self.text.insert('end', f'\n')
self.text.config(state='disabled')
self.button_frame.update_idletasks()
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def Text_Add(self):
self.text.config(state='normal')
self.text.insert('end', "Hello, world!")
self.text.config(state='disabled')
root = tk.Tk()
app = Three_layout(root)
root.mainloop()
```
在修改后的代码中,我将`Text_Add()`方法中的`self.text.config(state='normal')`添加了进去,以便在调用`insert()`方法之前将`state`设置为正常状态。
self.top = top self.frame = tk.Frame(self.top, bg='Gold', width=1100, height=234, highlightthickness=2, highlightbackground='Black') self.frame.place(x=0, y=670) self.canvas = tk.Canvas(self.frame, width=1077, height=226, bg='Gold') self.canvas.pack(side='left', fill='both', expand=True) self.scrollbar = tk.Scrollbar(self.frame, command=self.canvas.yview, orient=tk.VERTICAL) self.scrollbar.pack(side='right', fill='y') self.canvas.configure(yscrollcommand=self.scrollbar.set) self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) self.button_frame = tk.Frame(self.canvas, bg='Yellow') self.canvas.create_window((0, 0), window=self.button_frame, anchor="nw") self.Content()为什么这里对鼠标滚轮无效果
这段代码中的滚动条只是绑定了 Canvas 的 yview,但是没有绑定 button_frame 的大小,因此无法对鼠标滚轮产生响应。可以尝试在创建 button_frame 之后,调用 Canvas 的 configure(scrollregion) 方法,将其设置为可滚动的范围,即:
```
self.canvas.configure(scrollregion=self.canvas.bbox('all'))
```
这样就可以让鼠标滚轮对 button_frame 产生响应了。