English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tkinter(python3.6簡単な計算機を実現する

前略

実習コースが始まりました、うん、先生が来てからPPTを読んで、言いました:始めましょう.........

それから、PythonのGUIへの道が始まりました、以前はPythonのビジュアルインターフェースに触れていませんでした(それでも不適切です)

しかし、今や小さなツールを作るのはとても便利に感じています、最初に見つけたライブラリがTkinterで、それから始めました

後にQTがとても良いように思われました、次の実験ではQTを使おう。それからTkinter(Pythonについて)について3.6)

計算機のソースコード ennn.....命名が不规范です.....

まず、Pythonのスタックの実装はリストの方法でシミュレートされています

pop()でスタックから出力、append()でスタックに追加

まず、Tkinterが提供する一般的な核心小コンポーネントクラスを見てみましょう:

小コンポーネントクラス 説明
Button ボタン
Canvas 構造化グラフを使用してグラフを描画し、グラフエディタを作成し、カスタム小コンポーネントクラスを実現するために使用されます。
Checkbutton チェックボックスをクリックすると、値が切り替わります。
Entry テキストエリアまたはテキストボックス
Frame コンテナ(他の小コンポーネントを含むことができます)
Label テキストや画像を表示
Menu ドロップダウンメニューとポップアップメニューを表示するメニューバー
Menubutton ドロップダウンメニューのメニューボタン
Message ラベルに似たテキスト表示ですが、テキストを指定された幅と高さに自動的に配置します。
Radiobutton ラジオボタン
Text フォーマットされたテキストの表示をサポートし、画像やテキストを内嵌させ、異なるスタイルや属性でテキストの表示と編集を許可します。

ウィンドウを開始します。

視覚的なものを作成するとき、まず思い浮かぶのはウィンドウでしょう。

ウィンドウには多くの構成要素があります。例えば、title、ico、size、bd、メニューなど。

import tkinter
import os
from tkinter import *
class Calculator(object):
 """計算機"""
 def __init__(self):
 self.tk=tkinter.Tk() #インスタンス化
 self.tk.title('計算機')
 self.tk.minsize(370,460)
 self.tk.maxsize(400,400)
 #もしくはself.tk.resizable(0, 0)を使ってサイズ調整を禁止することもできます。
 self.tk.iconbitmap(os.getcwd())+'/favicon.ico')
 def start(self):
 self.tk.mainloop() 
if __name__ == '__main__':
 NewCalculator=Calculator()
 NewCalculator.start()

ここでは基本的なウィンドウが生成されます。mainloop()の役割について説明します。

それを削除すると、ウィンドウは一瞬で消えます。これはそのような状況を防ぐためです。

パネル表示

計算機を作成したら、まずは計算結果が必要になるでしょう。ここでは、表示パネルを生成する必要があります。

もちろん、表示される内容のフォント設定なども自然と連想されます。具体的な例は以下のコードにあります。

....
import tkinter.font as tkfont
....
 #字体设置
 self.EntryFont=tkfont.Font(self.tk, size=...13)
 self.ButtonFont=tkfont.Font(self.tk, size=...12)
 #パネル表示
 self.count=tkinter.StringVar()
 self.count.set('0')
 self.label=tkinter.Label(self.tk,bg='#EEE9E9',bd='3',fg='black',anchor='center',font=self.EntryFont,textvariable=self.count)
 self.label.place(y=10,width=380,height=40)
....

tkinterのパネルLabelにはいくつかのパラメータがありますが、ここで使用しているのは基本的なニーズを満たすだけでも十分です。

その中でbgは背景色、fgは前景色で、コンテンツの色を変更し、anchorはコンテンツをパネル内にどのように配置するかを指定します。以下の図を参照してください。

方向 テーブル
nw n ne
w center e
sw s se

パネルやその後のボタンの位置付けについては、多くの方法があります。placeは正確に位置付けることができますし、pack()やgrid()を使用することもできます。

計算機のplaceはもっと良い方法で、各コントロールを正確に位置付けることができます。

その中でフォントもLable()にパラメータを追加して直接設定できます、例えばfont=("Arial,6")

textvariableは「監視」の役割を果たしており、tkinterのstringにバインドすることで、set()の方法でパネルの内容を便利に変更できます。

ボタン、入力フィールドの設定

ボタン、入力フィールドのパラメータとパネル内のものは似通っています。

self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#EE6A50',text=self.ButtonList[0],
 font=self.ButtonFont,command=self.clear)
self.NumButton.place(x=30,y=80,width=70,height=55)
self.shiEntry=Entry(self.baoxianTk,validate='key',validatecommand=(self.checkNum,'%P'),font=self.EntryFont)
self.shiEntry.place(x=190,y=80)

同じのはbgなどのパラメータで基本的なスタイルを設定する方法が通っていることですが、ここではcommandでイベントをバインドして、JQの.clickに似ています。

ここでのplaceは、正確に位置を特定できるように使用されています。その中のreliefは、Buttonのスタイルを表します

relief=FLAT or GROOVE or RAISED or RIDGE or SOLID or SUNKEN

中で入力フィールドの入力内容を削除

text.delete(10) #インデックス値を削除10の値
text.delete(10, 20) #インデックス値から削除10まで20以前の値
text.insert(0, END) #すべての値を削除

入力制限

機能を設計する際には、ユーザーが数字を入力する必要がある場合があります。この場合、制限を設けることができます

Buttonパラメータのvalidateは、validatecommandバインドされた関数を実行するタイミングを指定します。%Pを使用して、リアルタイムで入力内容を取得できます

validateオプションがkeyに指定された場合、いかなる入力操作もインターセプトされ、この場合、Trueを返すと白エネルギーがEntryにインプットされます

self.checkNum=self.baoxianTk.register(self.validateNum)
self.gerenEntry=Entry(self.baoxianTk,validate='key',validatecommand=(self.checkNum,'%P'),font=self.EntryFont)
self.gerenEntry.place(x=190,y=190)
#数字の入力を確認 
def validateNum(self,content):
 if content.isdigit() and int(content)>=0 or content=="":
 return True
 else:
 return False

validateNum()関数は、必要に応じて変更できます

验证validateオプションを有効にすることで設定できる値は:

名前 イベント
focus Entryコンポーネントがフォーカスを取得または失ったときに確認を行います
focusin Entryコンポーネントがフォーカスを取得したときに確認を行います
focusout Entryコンポーネントがフォーカスを失ったときに確認を行います
key 入力フィールドが編集されたときに確認を行います
all 上記のいずれかの状況が発生した場合に確認を行います

拡張シンボルのデザイン

この小さな計算機では%、を追加しました/、sqrtの3つのシンボル

彼らの実装に対して、私の考え方は、パネルに追加する前に传入されたbutton内容を確認することです

これらの3つの記号がある場合、対応する処理を行います

特に、複数の桁の数や符号付きの式がある場合に注意してください

直接変換はできません。変換したい数字の桁数を判断する必要があります。私の具体的な方法は以下の通りです

 def checkList(self):
 result=0
 locate=-1
 listSum=0
 for length in range(0,len(self.inputlist)):
 if re.findall(r'[-+*/]',str(self.inputlist[length])):
 result=1
 if length>locate:
  locate=length
 else:
 pass
 if result==1:
 for i in range(locate+1,len(self.inputlist)):
 listSum+=int(self.inputlist[i])*(10**(len(self.inputlist)-i-1))
 else:
 for j in range(0,len(self.inputlist)):
 listSum+=int(self.inputlist[j])*(10**(len(self.inputlist)-j-1))
 return listSum,locate
 #添加button
 def addButton(self,button):
 if button==self.ButtonList[18]:
 listSum,locate=self.checkList()
 if locate==-1:
 self.inputlist=[str(round(eval('1/'+str(listSum)),5))]
 else:
 for k in range(locate+1,len(self.inputlist)):
  del self.inputlist[k]
 self.inputlist.append(str(round(eval('1/'+str(listSum)),5))
 elif button==self.ButtonList[19]:
 pass
 elif button==self.ButtonList[20]:
 pass
 else:
 self.inputlist.append(button)
 self.count.set(self.inputlist)

关于lambda

百度百科:Lambda表現はPythonにおいて特別な関数定義形式の一つで、それを使って匿名関数を定義できます

他の言語とは異なり、PythonのLambda表現の関数体は一つの文しか持てず、それは返り値表現文です

さらに多くの記事を検索して理解を深め、Lambda 関数はボタンに対して「call back」の役割を果たします

Lambda 関数を使用しない場合、ボタンを作成するときに command バインドされた関数が呼び出されます

以下の2つのコードの違いは、2番目のものが作成時に直接 knobDown 関数を実行します

self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[22
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[22

詳細な説明は文末の最後の2つの記事を参照してください、先輩の書き方が良いです

単選ボックスについて

PPT で示された例を実装しようと思いました-住宅ローン計算の拡張ですが、この単選ボックスがバグを発生させるために辞退しました

以下の例はネットから引用されていますが、具体的な URL を忘れました

IntVar() に variable をバインドし、.get() メソッドを使用して Radiobutton 内の value の値を取得できます

#!/usr/bin/env python
import tkinter
from tkinter import *
import tkinter.font as tkfont
root=tkinter.Tk()
val=tkinter.IntVar()
val.set(0)
def func1
 if val.get() == 0:
 label.configure(text='radio 0')
 else:
 label.configure(text='radio' 1
label = tkinter.Label(root, text='radio 0')
label.pack()
r0 = tkinter.Radiobutton(text = 'radio0', variable = val, value = 0)
r0.pack()
r1 = tkinter.Radiobutton(text = 'radio'1変数 variable = val, value = 1)
r1.pack()
b = tkinter.Button(root, text='button', command=func1)
b.pack()
root.mainloop()


パッケージ化

C:\Users\bayi\Desktop\shiyan\progrem
(venv) λ pip install pyinstaller
C:\Users\bayi\Desktop\shiyan\progrem
(venv) λ pyinstaller -F -w -i favicon.ico run.py

最初はコードでicoアイコンを設定しているからです

Windowsでパッケージ化されたパスの識別に問題があり、アイコンを短いパスのディレクトリに移動してください

絶対パスに変更するとOKです(以下のコードの2行目、exeとicoを同じディレクトリに配置してください)

self.baoxianTk.icobitmap('favicon.ico')
self.baoxianTk.iconbitmap(os.getcwd())+'/favicon.ico')

効果プレビュー

現学現売で、他人の古い知識でも成功すれば達成感があります(そして私は美工の要求が厳しいようです......)

色とスタイルを選ぶのに時間がかかります。特に以前のスパイダー用のフロントエンドのもの

まとめ

これでこの記事のすべての内容が終わりました。この記事の内容が皆様の学習や仕事に参考になることを願っています。何か疑問があれば、コメントを残してください。皆様の「呐喊ガイド」へのサポートに感謝します。

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードした内容です。このサイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権侵害が疑われる場合は、メールを送信してください:notice#oldtoolbag.com(メール送信時は、#を@に置き換えてください。通報し、関連する証拠を提供してください。一旦確認が取れたら、このサイトは即座に侵害する可能性のあるコンテンツを削除します。)

おすすめ