0

私はPythonの初心者です。私がやりたいのは、基本的なデジタル画像処理アルゴリズムを実装するシンプルなGUIを作成することです。tkinterスライダーで画像の明るさを調整したい。しかし、これは機能しておらず、私は初心者なので無知です。スケールウィジェットのコールバックが明るさの調整作業を行うことを期待していますが、何らかの理由でコールバックが呼び出されていません。

これが私のコードです:

import Tkinter as tk
import Image
import ImageTk
import numpy as np
import tkFileDialog

class DIP(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent) 
        self.parent = parent        
        self.initUI()

    def initUI(self):
        self.parent.title("DIP Algorithms- Simple Photo Editor")
        self.pack(fill = tk.BOTH, expand = 1)

        menubar = tk.Menu(self.parent)
        self.parent.config(menu = menubar)

        self.label1 = tk.Label(self, border = 25)
        self.label2 = tk.Label(self, border = 25)
        self.label1.grid(row = 1, column = 1)
        self.label2.grid(row = 1, column = 2)

        # File Menu
        fileMenu = tk.Menu(menubar)
        menubar.add_cascade(label = "File", menu = fileMenu)

        # Menu Item for Open Image
        fileMenu.add_command(label = "Open", command = self.onOpen)        

        # Basic menu
        basicMenu = tk.Menu(menubar)        
        menubar.add_cascade(label = "Basic", menu = basicMenu)

        # Menu Item for image negative
        basicMenu.add_command(label = "Negative", command = self.onNeg)

        #menu for brightness
        basicMenu.add_command(label = "Brightness", command = self.onBrghtness)

    def onBrghtness(self):
        #Image Brightness Adjustment Menu callback
        brgTk=tk.Tk()
        self.brgSc = tk.Scale( brgTk, from_=-50, to=50, orient=tk.HORIZONTAL, command=self.adjBright, length=200 ,width=10, sliderlength=15)
        self.brgSc.pack(anchor=tk.CENTER)

    def adjBright(self):
        print self.brgSc #***here how can i get slider value, this callback is not being invoked***???

    def onNeg(self):
        #Image Negative Menu callback
        self.I2 = 255-self.I;
        self.im = Image.fromarray(np.uint8(self.I2))
        photo2 = ImageTk.PhotoImage(self.im)
        self.label2.configure(image=photo2)
        self.label2.image = photo2 # keep a reference!

    def setImage(self):
        self.img = Image.open(self.fn)
        self.I = np.asarray(self.img)
        l, h = self.img.size
        text = str(2*l+100)+"x"+str(h+50)+"+0+0"
        self.parent.geometry(text)
        photo = ImageTk.PhotoImage(self.img)
        self.label1.configure(image = photo)
        self.label1.image = photo # keep a reference!

    def onOpen(self):
        #Open Callback
        ftypes = [('Image Files', '*.tif *.jpg *.png')]
        dlg = tkFileDialog.Open(self, filetypes = ftypes)
        filename = dlg.show()
        self.fn = filename
        #print self.fn #prints filename with path here
        self.setImage()

    #def onError(self):
        #box.showerror("Error", "Could not open file")    


def main():
    root = tk.Tk()
    DIP(root)
    root.geometry("320x240")
    root.mainloop()  

if __name__ == '__main__':
    main()

私が問題について言及したコードでは、次のようなことを言っているため、コールバックは失敗します。

Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args) 
TypeError: adjBright() takes exactly 1 argument (2 given)

助けてください、私は尋ねるのが愚かなタイプの質問かもしれないことを知っています、しかし私はまだ初心者であり、私は時間とともにPYTHONを深く理解することを願っています...

4

1 に答える 1

2

トレースバック(最後の最後の呼び出し):ファイル "C:\ Python27 \ lib \ lib-tk \ Tkinter.py"、行1410、呼び出しでreturn self.func(* args)TypeError:adjBright()は正確に1つの引数を取ります(2与えられた)

スケールコールバックには常にスケールの新しい値が渡されるため、このエラーが発生します。adjBright引数としてのみ持つように定義しているselfため、Tkinterはエラーをスローします。残念ながら、これはTkinterの文書化されていない機能のようです。

に別の引数を追加するとadjBright、新しい値のフェッチについて心配する必要はありません。

def adjBright(self, new_value):
    print "the slider value is", new_value
于 2013-01-14T20:51:21.583 に答える