2

カスタムのタイトルバーとフレームを持つウィンドウを Tk で作成したいと考えています。この Web サイトでこれに関する多くの質問を見てきましたが、私が探しているのは、実際にキャンバスを使用してフレームをレンダリングし、コンテンツをキャンバスに追加することです。境界線がグラデーションになっているため、フレームを使用してこれを行うことはできません。

このウェブサイトによると: http://effbot.org/tkinterbook/canvas.htm#Tkinter.Canvas.create_window-method、他のキャンバスアイテムをウィジェットの上に置くことはできません(create_windowメソッドを使用して)が、私はする必要がありますそのため、私のウィジェットの一部はキャンバスを使用してレンダリングされます。

これを行う方法に関する提案はありますか?私はここで無知です。

編集: Bryan Oakley は、キャンバスでのレンダリングは不可能であることを確認しました。カスタムの境界線の色を持つフレームを持つことは可能でしょうか? もしそうなら、誰かが簡単な例を挙げてもらえますか? 私はPythonの初心者です。

4

2 に答える 2

3

キャンバスをフレームのように使用して、独自のウィンドウ境界を描画できます。ただし、あなたが言ったように、キャンバスに埋め込まれたウィジェットの上にキャンバス アイテムを描画することはできません。ウィジェットは常に最高の積み重ね順になります。本当にそれを行う必要があるかどうかは明らかではありませんが、それを回避する方法はありません。

カスタム境界線のグラデーションを使用してウィンドウを作成する方法を示す簡単で汚い例を次に示します。例を簡潔にするために、ウィンドウの移動やサイズ変更を可能にするコードは追加しませんでした。また、グラデーションには固定色を使用します。

import Tkinter as tk

class GradientFrame(tk.Canvas):
    '''A gradient frame which uses a canvas to draw the background'''
    def __init__(self, parent, borderwidth=1, relief="sunken"):
        tk.Canvas.__init__(self, parent, borderwidth=borderwidth, relief=relief)
        self._color1 = "red"
        self._color2 = "black"
        self.bind("<Configure>", self._draw_gradient)

    def _draw_gradient(self, event=None):
        '''Draw the gradient'''
        self.delete("gradient")
        width = self.winfo_width()
        height = self.winfo_height()
        limit = width
        (r1,g1,b1) = self.winfo_rgb(self._color1)
        (r2,g2,b2) = self.winfo_rgb(self._color2)
        r_ratio = float(r2-r1) / limit
        g_ratio = float(g2-g1) / limit
        b_ratio = float(b2-b1) / limit

        for i in range(limit):
            nr = int(r1 + (r_ratio * i))
            ng = int(g1 + (g_ratio * i))
            nb = int(b1 + (b_ratio * i))
            color = "#%4.4x%4.4x%4.4x" % (nr,ng,nb)
            self.create_line(i,0,i,height, tags=("gradient",), fill=color)
        self.lower("gradient")

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.wm_overrideredirect(True)
        gradient_frame = GradientFrame(self)
        gradient_frame.pack(side="top", fill="both", expand=True)
        inner_frame = tk.Frame(gradient_frame)
        inner_frame.pack(side="top", fill="both", expand=True, padx=8, pady=(16,8))

        b1 = tk.Button(inner_frame, text="Close",command=self.destroy)
        t1 = tk.Text(inner_frame, width=40, height=10)
        b1.pack(side="top")
        t1.pack(side="top", fill="both", expand=True)

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
于 2012-08-09T23:13:07.897 に答える
1
于 2012-08-10T02:25:47.117 に答える