小编Dan*_*xan的帖子

调整具有固定纵横比的 Tkinter 框架的大小

我正在寻找一种方法来使 Tkinter Frames 在调整大小时表现得有点像这样:

from Tkinter import *
w = Tk()
w.aspect(1,1,1,1)
w.mainloop()
Run Code Online (Sandbox Code Playgroud)

所以我想要这里的代码:

import Tkinter as tk
from Tkconstants import *
r=tk.Tk()
content_frame=tk.Frame(r,borderwidth=5,relief=GROOVE)
content_frame.grid(row=0,column=0,sticky=(N,S,E,W))
tk.Label(content_frame,text='content').pack()
pad_frame=tk.Frame(r,borderwidth=5,relief=GROOVE)
pad_frame.grid(row=1,column=0,sticky=(N,S,E,W))
tk.Label(pad_frame,text='-pad-').pack()
r.rowconfigure(0, weight=1)
r.rowconfigure(1, weight=1)
r.columnconfigure(0, weight=1)
r.mainloop()
Run Code Online (Sandbox Code Playgroud)

它基本上创建了 2 个框架,一个应该包含一些内容(在我的应用程序中,这个框架包含一个可以调整大小的 mathplotlib 图)和一个仅用于填充。

要按照以下规则调整大小:

  • 内容框架以固定的纵横比调整大小(假设它始终需要是方形的)
  • 垫框占用剩余的(垂直)空间

有任何想法吗?我已经阅读了一段时间的手册,似乎找不到合适的东西。

-丹尼尔

python resize tkinter frame aspect-ratio

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

继承自Tkinter.Canvas - 调用super会导致错误

我想问一个关于使用Canvas作为容器的聪明问题,但编写我的示例代码我偶然发现了一些奇怪的东西.这是迄今为止的代码:

import Tkinter as tk

class CCanvas(tk.Canvas):

    def __init__(self,master,*args,**kwargs):
        super(CCanvas,self).__init__(master=master,*args,**kwargs)


if __name__ == '__main__':
    root= tk.Tk()
    cc = CCanvas(root)
    cc.pack()
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

现在这段代码不应该做太多.CCanvas类继承自Canvas,没有实现任何东西,只调用超类的构造函数.我认为没有任何理由不这样做.然而,当我运行它时,我收到以下错误:

super(CCanvas,self).__init__(master=master,*args,**kwargs)
TypeError: must be type, not classobj
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释这种行为,也许可以告诉我如何解决它?

python inheritance canvas tkinter super

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

TkCanvas中的动画NetworkX图:背景颜色

为了演示Graph算法,我需要将一个networkx图绘制到Tkinter Canvas,并能够在运行时修改该图(和图).

我拼凑了以下代码(我希望它是导致我的问题的最小代码,但我是新手,所以我不确定):

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import Tkinter as Tk
import networkx as nx
from tkMessageBox import showinfo

root = Tk.Tk()
root.wm_title("Animated Graph embedded in TK")
root.wm_protocol('WM_DELETE_WINDOW', root.quit())

f = plt.figure(figsize=(5,4))
a = f.add_subplot(111)
plt.axis('off')

# the networkx part
G=nx.complete_graph(5)
nx.draw_networkx(G,pos=nx.spring_layout(G),ax=a)

# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def next_graph():
    if G.order():
        a.cla()
        G.remove_node(G.nodes()[-1])
        nx.draw(G, pos=nx.circular_layout(G), ax=a)
        canvas.draw()

b = Tk.Button(root, text="next",command=next_graph)
b.pack()  

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

我现在的问题是:图表的第一个显示就像我想要的那样(背景颜色),但是在您第一次点击"下一步"后,图表的背景颜色变为白色.我试过改变图形和画布的背景颜色.我甚至不知道是什么带来了这种变化,我认为它只是简单地画了两次相同的画布.

如何修改代码以使图形始终具有相同的背景颜色?

在一个不相关的注释:我添加的root.quit()无助于正确结束应用程序.这可能是我的愚蠢,但这里出了什么问题?

python tkinter matplotlib background-color networkx

0
推荐指数
1
解决办法
2793
查看次数