标签: tkinter-canvas

Tkinter 拖放

我正在开发一个拖放功能,它允许我在画布上移动项目。我让它工作(有点),但我只稍微移动,但线穿过屏幕(并最终离开屏幕的可见部分)画布,所以我无法到达它。我不知道从这里去哪里。下面是我到目前为止创建的拖放代码:

def onPressToMove(self, event): #get initial location of object to be moved
    winX = event.x - self.workspace.canvasx(0)
    winY = event.y - self.workspace.canvasy(0)
    self.dragInfo["Widget"] = self.workspace.find_closest(event.x, event.y, halo = 5)[0]
    self.dragInfo["xCoord"] = winX
    self.dragInfo["yCoord"] = winY

def onReleaseToMove(self, event): #reset data on release
    self.dragInfo["Widget"] = None
    self.dragInfo["xCoord"] = 0
    self.dragInfo["yCoord"] = 0        

def onMovement(self, event):
    winX = event.x - self.workspace.canvasx(0)
    winY = event.y - self.workspace.canvasy(0)
    newX = winX - self.dragInfo["xCoord"]
    newY = winY - self.dragInfo["yCoord"]
    self.workspace.move(self.dragInfo["Widget"], newX, newY)
Run Code Online (Sandbox Code Playgroud)

DragInfo 是我用来存储数据的字典。最初我认为将画布坐标转换为窗口坐标会有所帮助,但它的作用与没有这些东西时相同。

python drag-and-drop tkinter tkinter-canvas

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

我如何在 tk.Canvas 上定位形状和文本,以免它们被切断?

我正在使用 Tkinter 的 Canvas 为我的 GUI 创建简单的图形。我注意到我想将我的形状和文本放在画布的角落,但它们最终被部分隐藏。对于文本,我看到anchor文档建议设置一个选项NW,例如,如果我想将文本放在左上角,但即使如此,我也只看到文本开头的一点点被剪切离开。这是我的代码:

import Tkinter as tk

root = tk.Tk()
root.geometry("300x300")
c = tk.Canvas(root, bg="green", width=300, height=300)
c.pack(fill="both", side="right", expand=True)
c.create_text(0,0,text="Hello world!", anchor="nw")

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

我知道我可以调整文本开始位置的坐标,并通过反复试验找出哪个给出最好的结果,但我想知道是否有更聪明的方法来做到这一点。

当我尝试创建形状(例如圆形)时,我注意到类似的事情:

import Tkinter as tk

root = tk.Tk()
root.geometry("300x300")
c = tk.Canvas(root, bg="green", width=300, height=300)
c.pack(fill="both", side="right",expand=True)
c.create_oval(0,0,300,300, fill="gray")

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

对于圆,最靠近边缘的圆部分被切除。如果我拉伸并拖动窗口变大,我可以看到圆圈的最右侧和最底部,因此它们正在被绘制。我也没有看到类似于anchor圆圈的选项。

我注意到我的画布周围、画布和窗户之间的空白空间最小。我将包装选项设置为对所有面进行填充,并在有额外空间时进行扩展。我想知道这是否是问题所在。

python tkinter python-2.7 tkinter-canvas

3
推荐指数
1
解决办法
1563
查看次数

Tkinter 滚动条不工作

我有一段在 python 3.4 上运行的 tkinter 代码,它是一个放置在带有垂直滚动条的画布中的大框架,但是滚动条呈灰色,并且似乎与框架的大小无关。我使用的代码本质上是:

class EntryWindow:
    def __init__(self, master):
        self.master = master
        self.master.minsize(750, 800)
        self.master.maxsize(1000, 800)
        self.canvas = tk.Canvas(self.master, borderwidth=0, bg='#ffffff')
        self.vsb = tk.Scrollbar(self.master)
        self.master_frame = tk.Frame(self.canvas)
        self.vsb.pack(side="right", fill='y')
        self.canvas.pack(side='left', fill='both', expand=True)
        self.canvas.create_window((0,0), window=self.master_frame, anchor='nw', tags='self.master_frame')
        self.canvas.config(yscrollcommand=self.vsb.set)
        self.master_frame.grid()

        ###build widgets and place into master_frame
        ...
Run Code Online (Sandbox Code Playgroud)

其中master_frame充满了使用网格几何管理器放置的约 36 个小部件,并达到约 2000 像素的垂直高度,但滚动条不起作用。

我看到一篇关于使用 ttk 滚动条的帖子,但是当我导入时我无法让它工作。我使用的输入语句是:

import tkinter as tk
import tkinter.ttk as ttk
Run Code Online (Sandbox Code Playgroud)

然后将该行替换self.vsb = tk.Scrollbar(self.master)self.vsb = ttk.Scrollbar(self.master)但这也没有解决问题。我还尝试删除 master 上的最小/最大尺寸(这些不是最终值,我一直在使用它)。

我做错了什么吗?我觉得它可能在我设置 canvas.config() 的行中,但我阅读了文档,它似乎是正确的。明天我计划在构建框架后尝试将框架加载到画布中。

但与此同时,如果这不起作用,任何帮助都会很棒!谢谢!

python tk-toolkit tkinter python-3.x tkinter-canvas

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

将用画布绘制的矩形的填充设置为 RGB 值

w.create_rectangle(x, y, s, s, fill=(109,170,44))
Run Code Online (Sandbox Code Playgroud)

我想实现这样的目标,但是当我尝试时出现错误。我正在使用数组/列表创建几个矩形,我希望它们是这种绿色阴影,但似乎无法找到一种有效的方法。到目前为止,唯一有效的是

w.create_rectangle(x, y, s, s, fill="green")
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的阴影。非常感谢任何帮助,我觉得虽然我在这里错过了一些重要且非常简单的东西,但我已经被这个问题挂了一段时间了。

tkinter python-3.x tkinter-canvas

3
推荐指数
1
解决办法
4561
查看次数

更改python tkinter画布中的线条坐标

我画了一条线tkinter.Canvas,现在我想移动一端。这可能itemconfig吗,例如与?

import tkinter

tk = tkinter.Tk()
canvas = tkinter.Canvas(tk)
canvas.pack()
line = canvas.create_line(0, 0, 100, 100)
tk.mainloop()
Run Code Online (Sandbox Code Playgroud)

现在我想将行尾更改为75, 25. 有没有更好的方法来删除该行并创建一个新行?

python tkinter-canvas

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

如何使用tkinter在鼠标坐标后绘制一条线?

我尝试使用以下代码绘制在tkinter中创建一行的点:

import tkinter as tk
from time import sleep

def myfunction(event):
    x, y = event.x, event.y
    x1 = (x+1)
    y1 = (y+1)
    canvas.create_line(x, y, x1, y1)
    sleep(0.5)



root = tk.Tk()

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()

root.bind('d', myfunction)


root.mainloop()
Run Code Online (Sandbox Code Playgroud)

可以理解的是,当我按下"d"时,该程序只能说明一点.我试过在myfunction函数中使用循环,如下所示:

def myfunction(event):
    x, y = event.x, event.y
    x1 = (x+1)
    y1 = (y+1)
    for x in range(0,5):
        canvas.create_line(x, y, x1, y1)
        sleep(0.1)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我尝试了很多其他解决方案,但似乎都没有.

有这个问题的解决方案吗?

python tkinter tkinter-canvas

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

如何在 Python 中更改 tkinter 画布上形状轮廓的粗细?

有没有办法增加或减少 tkinter 画布上形状轮廓的厚度?如果是这样,我该怎么做?

这是一些可以用作示例的代码。如何改变矩形的轮廓宽度?

from tkinter import *

root = Tk()
canvas = Canvas(root, width=500, height=350)
canvas.pack()

canvas.create_rectangle(50, 50, 150, 150, fill='blue')

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

python macos tkinter tkinter-canvas

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

如何使 tkinter 框架填充整个画布并随之扩展?

我想制作一个可滚动框架,填充应用程序窗口中的整个单元格。当调整窗口大小时,框架中的小部件应保持居中。由于框架不可滚动,我使用画布并在其窗口中放置了一个框架。滚动区域与框架相关联。但是我无法使框架扩展并填充整个画布区域。

我尝试在画布中为具有整个画布宽度的框架创建一个窗口,并将窗口宽度的变化与画布配置事件相关联。不过我得到了有线结果。该框架仅占据窗口的右侧部分。当我展开窗口时,它会向左移动。我将画布涂成黄色,将框架涂成绿色,以使事物可见。谢谢你的帮助!

import tkinter as tk


class FrameWithScrollBar(tk.Frame):

    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.canvas = tk.Canvas(self, bg='yellow')
        self.frame = tk.Frame(self.canvas, bg='green')
        self.scrollbar = tk.Scrollbar(self, orient='vertical',
                                command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self._frame_id = self.canvas.create_window(
                                 self.canvas.winfo_reqwidth(), 0,
                                 anchor='n',
                                 window=self.frame)
        self.frame.bind('<Configure>', self.onFrameConfigure)
        self.canvas.bind('<Configure>', self.onCanvasConfigure)

    def onFrameConfigure(self, event):       
        self.canvas.configure(scrollregion=self.frame.bbox('all'))

    def onCanvasConfigure(self, event):
        width = event.width
        self.canvas.itemconfigure(self._frame_id, width=width)


if __name__ == '__main__':

    root = tk.Tk()
    fws = FrameWithScrollBar(root)
    buttons = list()
    for i in range(5):
        for j in …
Run Code Online (Sandbox Code Playgroud)

python tkinter tkinter-canvas tkinter-layout

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

如何在 tkinter 画布中制作拖放动画?

目前我有一个

canvas.tag_bind(tag, "<ButtonRelease-1>", func=move_point)
Run Code Online (Sandbox Code Playgroud)

用于移动我的点的语句,该语句会删除旧点并在用户释放按钮 1 的位置创建新点。这是可行的,但感觉很卡顿,而且 Button-1 已用完,无法用于在点之间建立连接等。我尝试过使用 b1-motion 但它只会将中心移动到我第一次移动鼠标的位置。

我的问题是如何制作一个干净的动画(如 Windows 文件拖放动画)?

下面是我移动了几个点的图表图片。

图形

python canvas tkinter mouseevent tkinter-canvas

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

如果鼠标滚轮位于滚动条所在的框架中,如何使用鼠标滚轮在 Tkinter 中滚动?

我知道有.bind这个.bind_all方法,但是这两个方法都存在问题。如果您使用.bind,则仅当光标位于该框架的空白区域时它才会滚动。如果你使用.bind_all,无论你的鼠标在哪里,只要你使用鼠标滚轮,它就会滚动。有没有办法仅当光标位于某个帧时才用鼠标滚轮滚动它?

python tkinter scrollbar tkinter-canvas

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