我试图将数据库的内容输出到Tkinter小部件.数据库有足够的行和列,我需要启用水平和垂直滚动条,但我很难获得水平和垂直滚动同时工作.我不知道使用了哪个Tkinter小部件,但这是我当前的实现:
# Create root
self.root = Tk()
self.root.geometry('1000x500+0+0')
# Create canvas
self.canvas = Canvas(self.root)
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE)
# Create scrollbars
self.xscrollbar = Scrollbar(self.root, orient=HORIZONTAL, command=self.canvas.xview)
self.xscrollbar.pack(side=BOTTOM, fill=X)
self.yscrollbar = Scrollbar(self.root, orient=VERTICAL, command=self.canvas.yview)
self.yscrollbar.pack(side=RIGHT, fill=Y)
# Attach canvas to scrollbars
self.canvas.configure(xscrollcommand=self.xscrollbar.set)
self.canvas.configure(yscrollcommand=self.yscrollbar.set)
# Create frame inside canvas
self.frame = Frame(self.canvas)
self.canvas.create_window((0,0), window=self.frame, anchor=NW)
self.frame.bind('<Configure>', self.set_scrollregion)
# Write db contents to canvas
self.print_dbcontents()
# Invoke main loop
self.root.mainloop()
def set_scrollregion(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox('all'))
Run Code Online (Sandbox Code Playgroud)
在这个实现中,我只能在一个方向上滚动,这取决于我如何打包画布:
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) # scrolling works in x but …Run Code Online (Sandbox Code Playgroud) 我似乎无法让我的PIL Image在画布上工作.码:
from Tkinter import*
import Image, ImageTk
root = Tk()
root.geometry('1000x1000')
canvas = Canvas(root,width=999,height=999)
canvas.pack()
image = ImageTk.PhotoImage("ball.gif")
imagesprite = canvas.create_image(400,400,image=image)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "C:/Users/Mark Malkin/Desktop/3d Graphics Testing/afdds.py", line 7, in <module>
image = ImageTk.PhotoImage("ball.gif")
File "C:\Python27\lib\site-packages\PIL\ImageTk.py", line 109, in __init__
mode = Image.getmodebase(mode)
File "C:\Python27\lib\site-packages\PIL\Image.py", line 245, in getmodebase
return ImageMode.getmode(mode).basemode
File "C:\Python27\lib\site-packages\PIL\ImageMode.py", line 50, in getmode
return _modes[mode]
KeyError: 'ball.gif'
Run Code Online (Sandbox Code Playgroud)
我需要使用PIL图像而不是PhotoImages,因为我想调整图像的大小.请不要建议切换到Pygame,因为我想使用Tkinter.
有没有办法将画布坐标转换为Tkinter中的窗口坐标?
这与从窗口到画布坐标转换相反,如下所示:
x = canvas.canvasx(event.x)
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我正在尝试使用Tkinter Canvas(self._canvas)来创建窗口使用create_window函数.该函数的窗口字段是Tkinter Frame(self._tableFrame).有人可以帮我解决如何自动self._tableFrame扩展到大小self._canvas(即使用户改变窗口大小后)?
码:
from Tkinter import Scrollbar as tkScrollBar
from Tkinter import Frame as tkFrame
from Tkinter import Canvas as tkCanvas
from Tkinter import Entry as tkEntry
from Tkinter import StringVar as tkStringVar
from Tkinter import Tk, HORIZONTAL, N, S, E, W, RIGHT, LEFT, BOTTOM, X, Y, BOTH
from Tkinter import TOP
class Widget(tkFrame):
def __init__(self, master=None):
tkFrame.__init__(self, master)
self._str = tkStringVar()
self._widget …Run Code Online (Sandbox Code Playgroud) 我想从Canvas中获取一个按钮.我已尝试pack按钮小部件中的画布,但这不起作用.谷歌搜索了一下,我发现(这里:你如何在tkinter Canvas上创建一个Button?),Canvas方法create_window可能有所帮助.但是我使用它的方式应该有问题.
import Tkinter
DIM = 100
root = Tkinter.Tk()
frame = Tkinter.Frame(root)
button = Tkinter.Button(None, width=DIM, height=DIM, command=root.quit)
circle = Tkinter.Canvas(frame, width=DIM, height=DIM)
circle.create_oval(5, 5, DIM-5, DIM-5, fill="red")
circle.create_window(0, 0, window=button)
frame.grid()
circle.grid(row=1, column=1)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
如果我擦掉create_window线条,我可以看到我的画,但我不能(显然)点击它.但是通过这种方式,按钮小部件覆盖了我的圈子并显示了一个悲伤的空按钮.
基本上,我想创建一个内部涂有红色圆圈的按钮.
我想Canvas通过鼠标点击(按住)+鼠标移动来移动整个tkinter .我试过canvas.move但不幸的是它不起作用.
如何滚动整个画布?(不要移动画布的每个元素,而是滚动画布的显示区域)
import Tkinter as Tk
oldx = 0
oldy = 0
def oldxyset(event):
global oldx, oldy
oldx = event.x
oldy = event.y
def callback(event):
# How to move the whole canvas here?
print oldx - event.x, oldy - event.y
root = Tk.Tk()
c = Tk.Canvas(root, width=400, height=400, bg='white')
o = c.create_oval(150, 10, 100, 60, fill='red')
c.pack()
c.bind("<ButtonPress-1>", oldxyset)
c.bind("<B1-Motion>", callback)
root.mainloop()
Run Code Online (Sandbox Code Playgroud) 我在Canvas上绘制一个矩形:
canvas = Canvas(parent, cursor="cross")
rect = canvas.create_rectangle(20,20, 1, 1, fill="")
Run Code Online (Sandbox Code Playgroud)
我只是想绘制边框,使内部透明的(这就是为什么我设置fill=""为提到在这里).
我的问题:
我希望矩形有一个红色边框.我怎样才能做到这一点?
使用 tkinter 画布,为了计算我显示的图形的大小,我通常使用函数winfo_screenwidth(),并相应地调整我的对象的大小。但是当在有两个显示器的系统上使用时,winfo_screenwidth()返回两个显示器的组合宽度——这会弄乱我的图形。如何分别找出每台显示器的屏幕宽度(以像素为单位)?
我在各种 Linux 机器(Ubuntu 和 Mint)上使用多个版本的 Python 3.x 和多个版本的 tkinter(均为 8.5 或更高版本)时遇到了这个问题。
例如,第一台显示器的宽度为 1440 像素。第二个是 1980 像素宽。winfo_screenwidth()返回 3360。
我需要找到一种方法来独立确定每个显示器的屏幕宽度。
谢谢!
我在 tkinter 画布中有几个不同的对象标签。我希望用户能够删除带有标记的鼠标光标下的当前对象"token"。
我不希望"token"删除带有标记的所有对象,只删除鼠标光标下的对象。我希望"token"能够删除带有标记的任何对象。我想禁止删除带有标签的对象"line"。我试过了:
self.canvas.delete("current")
Run Code Online (Sandbox Code Playgroud)
但这允许我删除鼠标光标下的任何内容(包括线对象)。当我尝试
self.canvas.delete("token")
Run Code Online (Sandbox Code Playgroud)
这让我可以"token"一次性删除所有带有标签的项目。以下是我的线对象、"token"对象和删除函数的定义摘录:
# create static line
self.canvas.create_line(50,250,200,250, width=7, fill="grey", tags="line")
#Create oval
myoval = self.canvas.create_oval(x0,y0,x1,y1, width=10, outline="black", fill="black",
tags="token")
def on_button_press_deleteoval(self,event):
'''Delete oval with double button 1 click.'''
self.canvas.delete("current")
Run Code Online (Sandbox Code Playgroud) 我的目标是让滚动条停留在全屏窗口的右侧,允许用户上下滚动各种不同的小部件(例如标签和按钮)。从我在本网站上看到的其他答案中,我得出的结论是,必须将滚动条分配给画布才能使其正常运行,我曾尝试将其包含在我的代码中,但没有太多成功与。
下面的代码显示了我迄今为止设法完成的简化版本:
from tkinter import *
root = Tk()
root.state("zoomed")
root.title("Vertical Scrollbar")
frame = Frame(root)
canvas = Canvas(frame)
Label(canvas, text = "Test text 1\nTest text 2\nTest text 3\nTest text 4\nTest text 5\nTest text 6\nTest text 7\nTest text 8\nTest text 9", font = "-size 100").pack()
scrollbar = Scrollbar(frame)
scrollbar.pack(side = RIGHT, fill = Y)
canvas.configure(yscrollcommand = scrollbar.set)
canvas.pack()
frame.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
运行此代码时,我面临两个问题:
一种是滚动条处于非活动状态,并且不允许用户向下滚动以查看文本的其余部分。
另一种是滚动条附加在文本的右侧,而不是窗口的右侧。
到目前为止,我在这个站点上找到的其他答案都没有使我能够修改我的代码以支持我的程序的全功能滚动条。我将非常感谢阅读本文的任何人可以提供的任何帮助。