标签: tkinter-canvas

Tkinter小工具上的垂直和水平滚动条

我试图将数据库的内容输出到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)

python tkinter scrollbar tkinter-canvas

8
推荐指数
1
解决办法
2万
查看次数

如何在画布上的Tkinter中打开PIL图像

我似乎无法让我的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.

python tkinter python-imaging-library tkinter-canvas

8
推荐指数
3
解决办法
3万
查看次数

Python Tkinter将画布坐标转换为窗口坐标

有没有办法将画布坐标转换为Tkinter中的窗口坐标?

这与从窗口到画布坐标转换相反,如下所示:

x = canvas.canvasx(event.x)
Run Code Online (Sandbox Code Playgroud)

提前致谢.

python tkinter coordinate-systems tkinter-canvas

7
推荐指数
1
解决办法
5309
查看次数

Tkinter Canvas create_window()

我正在尝试使用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)

python tkinter python-2.7 tkinter-canvas

7
推荐指数
1
解决办法
2万
查看次数

如何使用tkinter Canvas小部件制作Button?

我想从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线条,我可以看到我的画,但我不能(显然)点击它.但是通过这种方式,按钮小部件覆盖了我的圈子并显示了一个悲伤的空按钮.

基本上,我想创建一个内部涂有红色圆圈的按钮.

python tkinter button tkinter-canvas

7
推荐指数
2
解决办法
9584
查看次数

使用鼠标移动tkinter画布

我想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)

python user-interface tkinter tkinter-canvas

7
推荐指数
1
解决办法
7665
查看次数

Tkinter:如何着色画布矩形的轮廓?

我在Canvas上绘制一个矩形:

 canvas = Canvas(parent,  cursor="cross")   
 rect = canvas.create_rectangle(20,20, 1, 1, fill="")
Run Code Online (Sandbox Code Playgroud)

我只是想绘制边框,使内部透明的(这就是为什么我设置fill=""为提到在这里).

我的问题:

我希望矩形有一个红色边框.我怎样才能做到这一点?

python tkinter tkinter-canvas

7
推荐指数
1
解决办法
1万
查看次数

tkinter winfo_screenwidth() 与双显示器一起使用时

使用 tkinter 画布,为了计算我显示的图形的大小,我通常使用函数winfo_screenwidth(),并相应地调整我的对象的大小。但是当在有两个显示器的系统上使用时,winfo_screenwidth()返回两个显示器的组合宽度——这会弄乱我的图形。如何分别找出每台显示器的屏幕宽度(以像素为单位)?

我在各种 Linux 机器(Ubuntu 和 Mint)上使用多个版本的 Python 3.x 和多个版本的 tkinter(均为 8.5 或更高版本)时遇到了这个问题。

例如,第一台显示器的宽度为 1440 像素。第二个是 1980 像素宽。winfo_screenwidth()返回 3360。

我需要找到一种方法来独立确定每个显示器的屏幕宽度。

谢谢!

python tkinter tkinter-canvas

7
推荐指数
2
解决办法
9564
查看次数

能够删除具有特定对象标签 tkinter 的所有项目

我在 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)

python tkinter tkinter-canvas

7
推荐指数
1
解决办法
3347
查看次数

Tkinter、Python 中框架的垂直滚动条

我的目标是让滚动条停留在全屏窗口的右侧,允许用户上下滚动各种不同的小部件(例如标签和按钮)。从我在本网站上看到的其他答案中,我得出的结论是,必须将滚动条分配给画布才能使其正常运行,我曾尝试将其包含在我的代码中,但没有太多成功与。

下面的代码显示了我迄今为止设法完成的简化版本:

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)

运行此代码时,我面临两个问题:

一种是滚动条处于非活动状态,并且不允许用户向下滚动以查看文本的其余部分。

另一种是滚动条附加在文本的右侧,而不是窗口的右侧。

到目前为止,我在这个站点上找到的其他答案都没有使我能够修改我的代码以支持我的程序的全功能滚动条。我将非常感谢阅读本文的任何人可以提供的任何帮助。

python tkinter scrollbar python-3.x tkinter-canvas

7
推荐指数
1
解决办法
4万
查看次数