質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

850閲覧

Bitを反転させるプログラムで引数を追加するとエラーになる

occho222

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2020/03/27 15:21

編集2020/03/27 16:16

Tkinterでプログラマ電卓を作成しています。
ボタンを押したらビットを反転させる下記のプログラムですが、引数を追加するとコンパイルエラーとなります。
なぜエラーとなるのか教えていただけないでしょうか?

下記のコードの場合は問題なく動作しますが、

def buttonBit(self): val_edit3=eval(self.frame1.edit3.get())^(1<<0) #XORで反転

下記のコードの場合、「SyntaxError: unexpected EOF while parsing」となります。

def buttonBit(self,n:int): val_edit3=eval(self.frame1.edit3.get())^(1<<n) #XORでn番目のbitを反転

以下がエラーの全文になります。

Traceback (most recent call last):
File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 267, in <module>
app = Caluculator(master=root)
File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 13, in init
self.createWidgets()
File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 44, in createWidgets
self.frame4.button16 = tkinter.Button(self.frame4,text="",command=self.buttonBit(0),font=self.font1)
File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 146, in buttonBit
val_edit3=eval(self.frame1.edit3.get())^(1<<n) #XORで反転
File "<string>", line 0

^
SyntaxError: unexpected EOF while parsing

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2020/03/27 15:29

エラーの出る過程でなにかわかるかもしれないので、一応tracebackを含めたエラー全文を追記しておいてください。
occho222

2020/03/27 15:45

下記が全文になります。 Traceback (most recent call last): File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 267, in <module> app = Caluculator(master=root) File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 13, in __init__ self.createWidgets() File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 44, in createWidgets self.frame4.button16 = tkinter.Button(self.frame4,text="",command=self.buttonBit(0),font=self.font1) File "c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 146, in buttonBit val_edit3=eval(self.frame1.edit3.get())^(1<<n) #XORで反転 File "<string>", line 0 ^ SyntaxError: unexpected EOF while parsing
hayataka2049

2020/03/27 15:48

この欄に貼るのではなく質問を編集して追記する形でお願いします。
guest

回答1

0

ベストアンサー

掲載されたコードは問題ありませんでした。呼び出し側の問題のようです。

"c:/Users/xxxx/Desktop/pythonproject/Caluculator/Caluculator.py", line 44, in createWidgets self.frame4.button16 = tkinter.Button(self.frame4,text="",command=self.buttonBit(0),font=self.font1)

ここのcommand=の時点で、buttonBit(0) が呼び出されます。

恐らくこの時点の self.frame1.edit3 は未入力の状態で、
eval() が空文字を評価して、最終的なエラーとなっています。

>>> eval("") File "<string>", line 0 ^ SyntaxError: unexpected EOF while parsing

File の部分の "<string>" は文字列を eval 等で評価した場合。


解決策

ボタンをクリックした時にself.buttonBitを呼び出すように。
ボタンによって呼び出すメソッドの引数を変えたいのであれば、

functools.partial で引数を束縛します。

python

1from functools import partial 2 3# Buttonの引数部分で 4command=partial(self.buttonBit, 0)

もしくは、lambdaを使って、

python

1command=lambda:self.buttonBit(0)

引数の部分を変えて頻繁に使いまわす場合は、主にコード短縮目的で

python

1bindButtonBit = lambda n: functools.partial(self.buttonBit, n) 2 3command=bindButtonBit(0)

投稿2020/03/27 17:47

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

occho222

2020/03/28 14:42

ありがとうございます。解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問