标签: tkinter-canvas

TKinter Canvas“破折号”选项的行为不符合预期

canvas.create_line(50, 500, 950, 500, dash=(5, 1), tags="splitDistance")
Run Code Online (Sandbox Code Playgroud)

这将创建一条如下所示的行:

XXXXX XXXXX XXXXX XXXXX
Run Code Online (Sandbox Code Playgroud)

5 个破折号,1 个空格,然后重复,如本文档所述

但当将1更改为任意值时,间隙大小不会改变

dash=(5, 100)

XXXXX XXXXX XXXXX XXXXX
Run Code Online (Sandbox Code Playgroud)

另一个奇怪的行为是,第一个参数仅在可被 5 整除时才会更改结果,例如:(5, 10, 15, 20...)

dash=(1, 1)

X X X X X X X X X X X X
Run Code Online (Sandbox Code Playgroud)

dash=(4, 1)

X X X X X X X X X X X X
Run Code Online (Sandbox Code Playgroud)

dash=(5, 1)

XXXXX XXXXX XXXXX XXXXX
Run Code Online (Sandbox Code Playgroud)

这是程序和结果的图像:

程序图像和结果

python tkinter python-3.x tkinter-canvas

6
推荐指数
1
解决办法
4862
查看次数

如何在 Windows 上获取 Tkinter 窗口的 HWND?

如何HWND在Windows上的python3中获取Tkinter窗口的?

  • 如果可能的话,我想获取 Tkinter 窗口的本机窗口句柄。
  • 我需要窗口的HWND或来执行自定义绘图操作。HDC

有没有办法获取HWNDCanvas任何其他子组件?

有一种方法可以列出当前进程创建的所有窗口。我还可以迭代前面列出的任何窗口的子窗口。这将是这个问题的丑陋的解决方案。

如果 Tkinter 不直接公开句柄,请发布任何替代解决方案。

windows tkinter python-3.x tkinter-canvas

6
推荐指数
1
解决办法
5006
查看次数

如何从 python 的 tkinter 画布中删除空白?

我尝试在互联网上大量搜索解决方案,但没有找到任何解决方案。我正在尝试删除画布上绘图周围的空白,如图所示,但到目前为止我还没有成功。

我写的简单代码是:

import tkinter as tk
import matplotlib
from matplotlib import style
style.use('seaborn-darkgrid')
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,    NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import random

class GUIplot(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        printButton = tk.Button(self, text="Plot1", command=lambda: self.printMessage(canvas,a))
        printButton.grid(row=0, column=0, sticky='w') 
        f = Figure(figsize=(24,12))
        a = f.add_subplot(111, axisbg='r')
        canvas = FigureCanvasTkAgg(f, self)
        canvas.get_tk_widget().grid(row=1, columnspan=2)
        #canvas._tkcanvas.config(bg='blue')
        canvas.show()
        canvas.blit()        

    def printMessage(self,canvas,a):
        a.clear()
        my_random_x = random.sample(range(100),10)
        my_random_y = random.sample(range(100),10)
        a.plot(my_random_x,my_random_y,'*')
        canvas.draw()
        print("Wow")

GUIplot1 = GUIplot()
GUIplot1.title('PlotFunction')
w, h = GUIplot1.winfo_screenwidth(), GUIplot1.winfo_screenheight() …
Run Code Online (Sandbox Code Playgroud)

python tkinter tkinter-canvas

5
推荐指数
1
解决办法
2884
查看次数

tkinter 将滚动条放在画布上的底部位置

关于我的 tkinter 画布上滚动条位置的问题。我有一个带有 3 个画布小部件的框架。感谢这篇文章的想法。我添加了一个水平滚动条,每个画布都有一个 50+ 列 500+ 行的 Pandas 数据框。负载不是很快,但这不是一个目标。

新行将添加到每个数据框的底部。这个新行需要验证。因此,与其每次都向下滚动,不如滚动条/或画布显示底部。

请参阅下面定义 3x 画布和 3x 滚动条 (x+y) 的代码。

def createBox(window):
    list_ = ['df1', 'df2', 'df3'] # 3 dataframes

    for i in range(3):
            mybox = LabelFrame(window, padx=5, pady=4)
            mybox.grid(row=i, column=0)
            createWindow(mybox, list_[i], i)

def createWindow(box, lt_actual, i):
    canvas = Canvas(box, borderwidth=0)
    frame = Frame(canvas)
            vsbY = Scrollbar(box, orient="vertical", command=canvas.yview)
            canvas.configure(yscrollcommand=vsbY.set, width=1200, heigh=200) 
            vsbY.pack(side="right", fill="y")

            vsbX = Scrollbar(box, orient="horizontal", command=canvas.xview)
            canvas.configure(xscrollcommand=vsbX.set, width=1200, heigh=200)       
            vsbX.pack(side="bottom", fill="x")

    #canvas.yview_moveto(1) - no effect …
Run Code Online (Sandbox Code Playgroud)

python tkinter pandas tkinter-canvas tkinter.scrollbar

5
推荐指数
2
解决办法
6134
查看次数

如何在画布项中插入图像?

我正在为学校开展一个游戏项目,看起来像这样:游戏方面

 在游戏方面

我创建了这样的彩色多边形:

ship = can.create_polygon(410,650,450,600,490,650 , fill= 'red' , outline='black')

ennemies = can.create_rectangle(x-r, y-r, x+r, y+r, fill='green')
Run Code Online (Sandbox Code Playgroud)

所以现在我想用自己的形象填充它们.那可能吗 ?如何 ?

python tkinter tkinter-canvas

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

在while循环中更改tkinter画布中的图像

我的全部代码都在这里

使用 tkinter 的画布,我试图创建一个小游戏,让人们练习学习高音谱号上的音符。

最初显示随机音符,用户必须选择正确的音符。如果学生得到正确答案,我将无法编辑画布以显示新笔记的图像。

有人可以解释一下我的代码有什么问题吗?

while True:
    randomNote = randint(0, 11)
    path = noteFiles[randomNote]
    correctNote = notes[randomNote]
    img = Image.open(path)
    tk_img = ImageTk.PhotoImage(img)
    canvas.create_image(505, 200, image=tk_img)

    root.mainloop()
    if correctNote == noteChosen:
        ''' User got last note right '''
        canvas.delete("all")
Run Code Online (Sandbox Code Playgroud)

python tkinter python-imaging-library python-3.x tkinter-canvas

5
推荐指数
1
解决办法
1778
查看次数

使用 tkinter -- 如果存在或类似的对象,如何清除 FigureCanvasTkAgg 对象?

尝试创建一个基于 tkinter 的窗口,允许用户在单击按钮时创建图表,刷新图表——而不是每次添加另一个图表。所有这些都无需创建新窗口。想法是单击 -> 创建图表,再次单击 -> 在同一位置用新图表替换图表。没有额外的点击,没有额外的按钮关闭。使用 matplotlib.backends.backend_tkagg 和 FigureCanvasTkAgg。这方面的文档似乎几乎不存在。在 .get_tk_widget() 中尝试了各种属性,看看我是否可以测试它是否已经存在,获取列表等。还尝试清除画布。

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *

class testme:
    def __init__(self,frame1):
        self.frame1=frame1     
        self.button=Button(self.frame1,text="DRAWME",command=self.plot) 
        self.button1=Button(self.frame1,text="CLEARME",command=self.clearme)
        self.button.pack()       
        self.button1.pack()      

    def plot(self):                   
        f=Figure(figsize=(5,1)) 
        aplt=f.add_subplot(111)       
        aplt.plot([1,2,3,4]) 
        self.wierdobject = FigureCanvasTkAgg(f, master=self.frame1) 
        self.wierdobject.get_tk_widget().pack() 
        self.wierdobject.draw()                

    def clearme(self):       
       self.wierdobject.get_tk_widget().pack_forget()     

root=Tk()
aframe=Frame(root)
testme(aframe)
aframe.pack()  #packs a frame which given testme packs frame 1 in testme
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

附加的示例代码几乎接近我的目标,但它需要一个“CLEARME”按钮(只有在“DRAWME”只单击一次时才有效。我只想要某种 if 语句来检查框架中是否已经存在 FigureCanvasTkAgg 对象,并且如果是这样,请删除它而不是单击按钮。

经过多次尝试,我得出结论,我对这里发生的不止一件事有根本的误解。

python tkinter tkinter-canvas

5
推荐指数
1
解决办法
6013
查看次数

Python3 tkinter画布,设置相对宽度和高度

我正在尝试将某些画布的宽度设置为母版的宽度(全屏),并将高度设置为母版的 1/5、3/10 和 1/2。窗口已正确显示,但画布未出现。我尝试使用 place() 而不是 pack() 并使用 relwidth = 1 和 relheight = 0.2 失败。我只想将我的三块画布堆叠起来并水平填充窗口。

master = Tk()
master.attributes('-zoomed', True)

w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5

c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()
Run Code Online (Sandbox Code Playgroud)

编辑:我的工作代码现在是:

c1 = Canvas(master)
c1.place(rely = 0, relheight …
Run Code Online (Sandbox Code Playgroud)

python tkinter python-3.x tkinter-canvas

5
推荐指数
1
解决办法
2174
查看次数

绘图时忽略 Matplotlib rcParams

我正在使用 matplotlib 3.2.2 版和 tkinter 编写交互式绘图脚本。

运行脚本时,第一个窗口如下所示: 在此处输入图片说明 此外,一旦单击Plot figure e 按钮,rcParams 就会更新和绘制:

在此处输入图片说明

如果我现在点击按钮更改绘图设置并更改例如markersize参数 -> Plot figure,则绘图更新如下:

在此处输入图片说明

但是,如果我尝试将标签大小更改为 20 像素,然后验证 rcParams['axes.labelsize']已更改,则它们是。但是 x 和 y 标签的大小在实际绘图中永远不会更新。

绘图标题(一直到绘图窗口顶部的文本输入字段)字体大小可以在绘图后更改。

最小代码:

"""
This is a script for interactively plotting a scatterplot and changing the plot params.
"""

import numpy as np
import matplotlib as mpl
import matplotlib.style
import random

mpl.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
import matplotlib.pyplot as plt …
Run Code Online (Sandbox Code Playgroud)

python tkinter matplotlib tkinter-canvas tkinter-entry

5
推荐指数
1
解决办法
289
查看次数

在Python中显示透明且没有背景或窗口的图像

我试图在屏幕上显示图像,而不弹出/包含任何窗口/应用程序。我对 TKinter 非常熟悉,但删除画布背景颜色的方法很糟糕,并且会产生一些不良效果。

import tkinter as tk
import ctypes
user32 = ctypes.windll.user32
screen_size = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

root = tk.Tk()

root.overrideredirect(True)
root.config(bg="blue", bd=0, highlightthickness=0)
root.attributes("-transparentcolor", "#FEFCFD")
root.attributes("-topmost", True)

tk_img = tk.PhotoImage(file="image.png")

canvas = tk.Canvas(root, bg="#FEFCFD", bd=0, highlightthickness=0, width=screen_size[0], height=screen_size[1])
canvas.pack()

img = canvas.create_image(0, 0, image=tk_img, anchor="nw")

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

-transparentcolor标志主要删除背景,但如果图像有任何部分透明的像素,它会给它们着色。另外,如果图像中存在该颜色,它将被删除;这种颜色的选择是希望最大限度地减少图像中的精确匹配,同时也以白色为主,希望对图像产生最不明显的影响。这是它当前的样子;非常接近我想要的,但是您可以在骰子的白色区域中看到一些丢失的像素,并且由于它们的边缘部分透明,它们周围似乎都有白色边框。这就是图像应该的样子。

我也尝试过使用 wxPython 来实现这种效果,但我无法删除窗口的背景,导致透明图像总是由某种颜色支持。我用了这个答案;我稍微修改了它,但我所做的一切都没有改善它。

那么,有没有一种方法可以用Python在屏幕上绘制完全没有背景的图像呢?

python wxpython tkinter tkinter-canvas

5
推荐指数
1
解决办法
3128
查看次数