瘋狂python講義-第11章的筆記 【未結題】

創建窗口

有錯誤哦!

#創建Frame的子類來創建窗口
from tkinter import *
class Application(Frame):
	def __init__(self,master = None):
		Frame.__init__(self,master)
		self.pack()
		self.initWidgets()

	def initWidgets(self):
		w = Label(self)
		bm = PhotoImage(file = 'serial.png')
		w.x = bm
		w['image'] = bm
		w.pack()
		okButton = Button(self,text = '確定')
		okButton['background'] = 'yellow'
		okButton.pack()

app = Application()
print(type(app.master))
app.master.title('窗口標題')
app.mainloop()	

#使用多個容器(Frame)分開佈局,再將Frame添加到窗口中。
from tkinter import *
class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()

	def initWidgets(self):
		fm1 = Frame(self.master)
		fm1.pack(side = LEFT,fill = BOTH,expand = YES)
		Button(fm1,text = '第1個').pack(side = TOP,fill = X,expand = YES)
		Button(fm1,text = '第2個').pack(side = TOP,fill = X,expand = YES)
		Button(fm1,text = '第3個').pack(side = TOP,fill = X,expand = YES)

		fm2 = Frame(self.master)
		fm2.pack(side = LEFT,padx = 10,expand = YES)
		Button(fm2,text = '第1個').pack(side = RIGHT,fill = Y,expand = YES)
		Button(fm2,text = '第2個').pack(side = RIGHT,fill = Y,expand = YES)
		Button(fm2,text = '第3個').pack(side = RIGHT,fill = Y,expand = YES)

		fm3 = Frame(self.master)
		fm3.pack(side = RIGHT,padx = 10,fill =BOTH,expand = YES)
		Button(fm3,text = '第1個').pack(side = BOTTOM,fill = Y,expand = YES)
		Button(fm3,text = '第2個').pack(side = BOTTOM,fill = Y,expand = YES)
		Button(fm3,text = '第3個').pack(side = BOTTOM,fill = Y,expand = YES)
		 

root = Tk()
root.title("pack佈局")
display = App(root)
root.mainloop()			

11.3.2Grid佈局管理器;網格佈局;

grid()方法;

#grid佈局;計算器界面
from tkinter import *

class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()

	def initWidgets(self):
		e = Entry(relief = SUNKEN,font = ('courier new',24),width = 25)
		e.pack(side = TOP,pady = 10)
		p = Frame(self.master)
		p.pack(side = TOP)
		names = (
			'0','1','2','3',
			'4','5','6','7',
			'8','9','+','-',
			'*','/','.','=')
		# for i in range(len(names)):
		for i in range(len(names)):
			# print(i)
			b = Button(p,text = names[i],font = ('Verdana',20),width = 6)
			b.grid(row = i // 4,column = i % 4)
root = Tk()
root.title("grid佈局;計算器界面")
App(root)
root.mainloop()

 

11.3.3palce佈局管理器;絕對佈局;

源代碼: 

#place絕對佈局
from tkinter import *
import random
class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()
	
	def initWidgets(self):
		books = (1,2,3,4,5)
		for i in range(len(books)):
			ct = [random.randrange(256) for x in range(3)]
			grayness = int(round(0.299*ct[0] + 0.587*ct[1] + 0.114*ct[2]))
			bg_color = '#%02x%02x%02x' %tuple(ct)
			lb = Label(
				text = books[i],
				fg = 'White' if grayness < 125 else 'Black',
				bg = bg_color
				)
			lb.place(x = 20,y = 36 + i*36,width = 180,height = 30)
root = Tk()
root.title("place絕對佈局")
root.geometry('250x250+30+30')
App(root)
root.mainloop()

簡化代碼;去掉隨機的部分;

#place絕對佈局
from tkinter import *
import random
class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()
	
	def initWidgets(self):
		books = (1,2,3,4,5)
		for i in range(len(books)):
			lb = Label(
				text = books[i],
				fg = 'White', 
				bg = 'black'
				)
			lb.place(x = 20,y = 36 + i*36,width = 180,height = 30)
root = Tk()
root.title("place絕對佈局")
root.geometry('250x250+30+30')
App(root)
root.mainloop()

 

11.4.1簡單的事件處理

#簡單的事件處理
from tkinter import *

class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()
	def initWidgets(self):
		self.label = Label(self.master,width = 30)
		self.label['font'] = ('Courier',20)
		self.label['bg'] = 'purple'
		self.label.pack()
		bn = Button(self.master,text = '單擊',command = self.change)
		bn.pack()
	#定義事件處理方法 
	def change(self):
		self.label['text'] = 'python'
		self.label['bg'] = 'blue'
		self.label['fg'] = 'yellow'
root = Tk()
root.title("標題")
App(root)
root.mainloop()

點擊按鈕之後

11.4.2事件綁定;單擊/雙擊

#事件綁定;單擊/雙擊
from tkinter import *
import sys
class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()

	def initWidgets(self):
		self.show = Label(self.master,width = 30,bg = 'white',font = ('times',20))
		self.show.pack()
		bn =Button(self.master,text ='單擊/雙擊')
		bn.pack(fill = BOTH,expand = YES)
		bn.bind('<Button-1>',self.one_click)
		bn.bind('<Double-1>',self.double_click)

	def one_click(self,event):
		self.show['text'] = '左鍵單擊:%s' % event.widget['text']

	def double_click(self,event):
		self.show['text'] = '左鍵雙擊:%s' % event.widget['text']
		sys.exit()
root = Tk()
root.title("事件綁定;單擊/雙擊")
App(root)
root.mainloop()

 鼠標移動事件處理

#鼠標移動事件處理
from tkinter import *
class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()

	def initWidgets(self):
		lb = Label(self.master,width = 40,height = 3)
		lb.config(bg = 'lightgreen',font = ('Times',20))
		lb.bind('<Motion>',self.motion)
		lb.bind('<B1-Motion>',self.press_motion)
		lb.pack()
		self.show = Label(self.master,width = 38,height = 1)
		self.show.config(bg = 'white',font = ('Courier New',20))
		self.show.pack()

	def motion(self,event):
		self.show['text'] = '鼠標移動(%s %s)' % (event.x,event.y)
		return

	def press_motion(self,event):
		self.show['text'] = '按住鼠標移動(%s %s)' % (event.x,event.y)
		return

root = Tk()	
root.title('鼠標事件')
App(root)
root.mainloop()

生成計算機;帶有單擊響應事件;不太理解啊;

#grid佈局;計算器;事件響應;
from tkinter import *
class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()
		self.expr = None

	def initWidgets(self):
		self.show = Label(
			relief = SUNKEN,
			font = ('Courier New',24),
			width = 25,
			bg = 'white',
			anchor = E
			)
		self.show.pack(side = TOP,pady = 10)
		p = Frame(self.master)
		p.pack(side = TOP)
		names = (
			'0','1','2','3',
			'4','5','6','7',
			'8','9','+','-',
			'*','/','.','=') 
		for i in range(len(names)): 
			b = Button(p,text = names[i],font = ('Verdana',20),width = 6)
			b.grid(row = i // 4,column = i % 4)
			b.bind('<Button-1>',self.click)
			if b['text'] == '=':
				b.bind('<Double-1>',self.clean)
	
	def click(self,event):
		if(event.widget['text'] in ('0','1','2','3','4','5','6','7','8','9','.')):
			self.show['text'] = self.show['text']+event.widget['text']
		
		elif(event.widget['text'] in ('+','-','*','/')):
			if self.expr is None:
				self.expr = self.show['text'] + event.widget['text']
			else:
				self.expr = self.show['text'] + event.widget['text']
			self.show['text'] = ''

		elif(event.widget['text'] == '=' and self.expr is not None):
			self.expr = self.expr +self.show['text']
			print(self.expr)
			self.show['text'] = str(eval(self.expr))
			self.expr = None
	
	def clean(self,event):
		self.expr = None
		self.show['text'] = ''

root = Tk()
root.title("計算器")
App(root)
root.mainloop()

11.5Tkinter常用組件 

#ttk組件
from tkinter import *
from tkinter import ttk

class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()

	def initWidgets(self):
		cb = ttk.Combobox(self.master,font = 24)
		cb = Listbox(self.master,font = 24)
		for i in ('python','swift','kotlin'):
			cb.insert(END,i)
		cb.pack(side = RIGHT,fill = BOTH,expand = YES)
		f = Frame(self.master)
		f.pack(side = RIGHT,fill = BOTH,expand = YES)
		lab = Label(self.master,text = '標籤',font = 24)
		lab.pack(side = TOP,fill = BOTH,expand = YES)
		bn = Button(self.master,text = '按鈕')
		bn.pack()

root = Tk()
root.title("事件處理")
App(root)
root.mainloop()

11.5.2Variable類;組件與變量雙向綁定;

#Entry組件與StringVar雙向綁定
#可以通過StringVar改變Entry輸入框顯示的內容
#可以通過StringVar獲得Entry輸入框中的內容
from tkinter import *
from tkinter import ttk
import random
from tkinter import messagebox

class App:
	def __init__(self,master):
		self.master = master
		self.initWidgets()

	def initWidgets(self):
		self.st = StringVar()
		ttk.Entry(self.master,textvariable = self.st,
			width = 24,
			font = ('StSong',20,'bold'),
			foreground = 'red').pack(fill = BOTH,expand = YES)
		f = Frame(self.master)
		f.pack()
		ttk.Button(f,text = '改變',command = self.change).pack(side = LEFT)
		ttk.Button(f,text = '獲取',command = self.get).pack(side = LEFT)
		
	def change(self):
		books = ('1','2','3')
		self.st.set(books[random.randint(0,2)])

	def get(self):
		messagebox.showinfo(title = '輸入內容',message = self.st.get())
root = Tk()
root.title("Variable測試")
App(root)
root.mainloop()

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章