English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
서론
실습 과정이 시작되었습니다. 아, 교수가 와서 PPT를 읽고 말했습니다: 시작하십시오.........
그런 다음 Python의 GUI 여정이 시작되었습니다. 이전에는 Python의 시각화 인터페이스를 접촉한 적이 없었습니다(그래도 이렇게는 매우 무지합니다)
하지만 지금은 작은 도구를 만드는 것이 매우 편리합니다. 첫 번째로 찾은 라이브러리가 Tkinter였기 때문에 바로 작업을 시작했습니다
그런 다음 QT가 매우 좋아 보였습니다. 다음 실험에서 QT를 사용하겠습니다. 그리고 Tkinter(python3.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,너비=380,높이=40) ....
tkinter 패널 Lable에는 몇 가지 매개변수가 있으며, 여기서 사용하는 것들은 대부분 일반적인 요구를 충족합니다
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,너비=70,높이=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 또는 GROOVE 또는 RAISED 또는 RIDGE 또는 SOLID 또는 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와 같은 기호
그들의 구현에 대한 제 생각은 패널에 추가하기 전에传入한 button 내용을 확인하는 것입니다
이 세 가지 기호 중 하나인 경우에 대해 처리를 합니다.
다중 자릿수나 부호가 들어간 식이 있을 때는 주의해야 합니다.
변환할 수 없으므로, 변환하려는 숫자의 자릿수를 판단해야 합니다. 제 구체적인 방법은 다음과 같습니다.
def checkList(self): result=0 locate=-1 listSum=0 for length in range(0,len(self.inputlist)): if re.findall(r'[-+*/] 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에 바인딩된 함수가 호출됩니다
아래两句代码的区别在于,第二句在创建时会直接执行knobDown 함수
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[20], font=self.ButtonFont,command=lambda:self.knobDown(self.ButtonList[20])) self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[20], font=self.ButtonFont,command=self.knobDown(self.ButtonList[20]))
자세한 설명은 문서의 마지막 두篇文章을 참고하세요, 전문가의 글이 잘 작성되었습니다
단일 선택 상자에 관해
PPT에서 제공된 예제를 구현하려고 했습니다-은 저당 계산 확장이었지만 이 단일 선택 상자에서BUG이 발생하여 포기했습니다
아래의 예제는 인터넷에서 가져왔습니다, 정확한 웹사이트는 기억이 나지 않습니다
IntVar()에 variable을 바인딩하여 Radiobutton의 값을 .get() 방식으로 가져올 수 있습니다
#!/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', 변수 = val, 값 = 0) r0.pack() r1 = tkinter.Radiobutton(text = 'radio)1변수 = val, 값 = 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에서 패키지 경로 인식에 문제가 있어, 아이콘을 경로가 짧은 곳으로 옮겨주세요
절대 경로로 변경하면 되요(아래 코드의 두 번째 줄, exe와 ico를 동일한 디렉토리에 두세요
self.baoxianTk.icobitmap('favicon.ico') self.baoxianTk.iconbitmap(os.getcwd()+'/favicon.ico')
이 효과를 미리 보기
虽然是现学现卖和对于别人的老知识,但是成功之后还是挺有成就感的(and我似乎对美工要求挑剔........
색상과 스타일을 고를 때마다 며칠이 걸립니다. 이전의 스파이더의 프론트엔드도 포함됩니다.
결론
이 문서의 모든 내용이 끝납니다. 이 문서의 내용이 여러분의 학습이나 업무에 참고 학습 가치가 있기를 바랍니다. 의문이 있으시면 댓글을 남겨 주시기 바랍니다. 감사합니다. 얕침 교본에 대한 여러분의 지지에 감사합니다.
성명: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원 저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용으로, 본 사이트는 소유권을 가지지 않으며, 인공적인 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있을 경우 notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 (이메일 발송 시 #을 @으로 변경하여) 신고를 하시고 관련 증거를 제공하시면, 사실이 확인되면 해당 사이트는 즉시 저작권 침해 내용을 삭제할 것입니다.