導航:首頁 > 編程語言 > python中menu菜單創建

python中menu菜單創建

發布時間:2022-08-28 00:53:48

python tkinter 如何做一個如下所示的下拉菜單

Tkinter居然沒有這種組件,所以就只能模擬了

#! /usr/bin/python
# -*- coding: utf8 -*-
from Tkinter import *
class Select(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.label = Label(self, text="選擇項目")
self.listBox = Listbox(self, height=1)
self.button = Button(self, text='V', command=self.triggle)
self.hideList = True
for i in xrange(10):
self.listBox.insert(i, 'Item%d'%i)
self.label.grid(row=0, column=0, sticky=N)
self.listBox.grid(row=0, column=1, sticky=N)
self.button.grid(row=0, column=2, sticky=N)
self.grid()
def triggle(self):
self.hideList ^= 1
self.listBox.config(height=[self.listBox.size(), 1][self.hideList])
app = Select()
app.mainloop()

僅供參考。

Ⅱ wxpython中,怎樣創建可以綁定單擊事件的一級菜單

本節看看菜單的創建及使用,直接看代碼。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
Function:繪圖
Input:NONE
Output: NONE
author: socrates
blog:http://www.cnblogs.com/dyx1024/
date:2012-07-13
'''

import wx

class PaintWindow(wx.Window):
def __init__(self, parent, id):
wx.Window.__init__(self, parent, id)
self.SetBackgroundColour("Red")
self.color = "Green"
self.thickness = 10

#創建一個畫筆
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
self.lines = []
self.curLine = []
self.pos = (0, 0)
self.InitBuffer()

#連接事件
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_MOTION, self.OnMotion)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.Bind(wx.EVT_PAINT, self.OnPaint)

def InitBuffer(self):
size = self.GetClientSize()

#創建緩存的設備上下文
self.buffer = wx.EmptyBitmap(size.width, size.height)
dc = wx.BufferedDC(None, self.buffer)

#使用設備上下文
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
self.DrawLines(dc)
self.reInitBuffer = False

def GetLinesData(self):
return self.lines[:]

def SetLinesData(self, lines):
self.lines = lines[:]
self.InitBuffer()
self.Refresh()

def OnLeftDown(self, event):
self.curLine = []

#獲取滑鼠位置
self.pos = event.GetPositionTuple()
self.CaptureMouse()

def OnLeftUp(self, event):
if self.HasCapture():
self.lines.append((self.color,
self.thickness,
self.curLine))
self.curLine = []
self.ReleaseMouse()

def OnMotion(self, event):
if event.Dragging() and event.LeftIsDown():
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
self.drawMotion(dc, event)
event.Skip()

def drawMotion(self, dc, event):
dc.SetPen(self.pen)
newPos = event.GetPositionTuple()
coords = self.pos + newPos
self.curLine.append(coords)
dc.DrawLine(*coords)
self.pos = newPos

def OnSize(self, event):
self.reInitBuffer = True

def OnIdle(self, event):
if self.reInitBuffer:
self.InitBuffer()
self.Refresh(False)

def OnPaint(self, event):
dc = wx.BufferedPaintDC(self, self.buffer)

def DrawLines(self, dc):
for colour, thickness, line in self.lines:
pen = wx.Pen(colour, thickness, wx.SOLID)
dc.SetPen(pen)
for coords in line:
dc.DrawLine(*coords)

def SetColor(self, color):
self.color = color
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)

def SetThickness(self, num):
self.thickness = num
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)

class PaintFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Panit Frame", size = (800, 600))
self.paint = PaintWindow(self, -1)

#狀態欄
self.paint.Bind(wx.EVT_MOTION, self.OnPaintMotion)
self.InitStatusBar()

#創建菜單
self.CreateMenuBar()

def InitStatusBar(self):
self.statusbar = self.CreateStatusBar()
#將狀態欄分割為3個區域,比例為1:2:3
self.statusbar.SetFieldsCount(3)
self.statusbar.SetStatusWidths([-1, -2, -3])

def OnPaintMotion(self, event):

#設置狀態欄1內容
self.statusbar.SetStatusText(u"滑鼠位置:" + str(event.GetPositionTuple()), 0)

#設置狀態欄2內容
self.statusbar.SetStatusText(u"當前線條長度:%s" % len(self.paint.curLine), 1)

#設置狀態欄3內容
self.statusbar.SetStatusText(u"線條數目:%s" % len(self.paint.lines), 2)

event.Skip()

def MenuData(self):
'''
菜單數據
'''
#格式:菜單數據的格式現在是(標簽, (項目)),其中:項目組成為:標簽, 描術文字, 處理器, 可選的kind
#標簽長度為2,項目的長度是3或4
return [("&File", ( #一級菜單項
("&New", "New paint file", self.OnNew), #二級菜單項
("&Open", "Open paint file", self.OnOpen),
("&Save", "Save paint file", self.OnSave),
("", "", ""), #分隔線
("&Color", (
("&Black", "", self.OnColor, wx.ITEM_RADIO), #三級菜單項,單選
("&Red", "", self.OnColor, wx.ITEM_RADIO),
("&Green", "", self.OnColor, wx.ITEM_RADIO),
("&Blue", "", self.OnColor, wx.ITEM_RADIO))),
("", "", ""),
("&Quit", "Quit", self.OnCloseWindow)))
]
def CreateMenuBar(self):
'''
創建菜單
'''
menuBar = wx.MenuBar()
for eachMenuData in self.MenuData():
menuLabel = eachMenuData[0]
menuItems = eachMenuData[1]
menuBar.Append(self.CreateMenu(menuItems), menuLabel)
self.SetMenuBar(menuBar)

def CreateMenu(self, menuData):
'''
創建一級菜單
'''
menu = wx.Menu()
for eachItem in menuData:
if len(eachItem) == 2:
label = eachItem[0]
subMenu = self.CreateMenu(eachItem[1])
menu.AppendMenu(wx.NewId(), label, subMenu) #遞歸創建菜單項
else:
self.CreateMenuItem(menu, *eachItem)
return menu

def CreateMenuItem(self, menu, label, status, handler, kind = wx.ITEM_NORMAL):
'''
創建菜單項內容
'''
if not label:
menu.AppendSeparator()
return
menuItem = menu.Append(-1, label, status, kind)
self.Bind(wx.EVT_MENU, handler,menuItem)

def OnNew(self, event):
pass

def OnOpen(self, event):
pass

def OnSave(self, event):
pass

def OnColor(self, event):
'''
更改畫筆內容
'''
menubar = self.GetMenuBar()
itemid = event.GetId()
item = menubar.FindItemById(itemid)
color = item.GetLabel() #獲取菜單項內容
self.paint.SetColor(color)

def OnCloseWindow(self, event):
self.Destroy()

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = PaintFrame(None)
frame.Show(True)
app.MainLoop()

Ⅲ python tkinter中如何像菜單中的一個選項添加快捷鍵

python中tkinter需要使用accelerator添加菜單的快捷鍵,該選項僅顯示,並沒有實現加速鍵的功能,添加功能需按鍵綁定,代碼如下:

fromtkinterimport*
root=Tk()
defcallback():
print("~被調用了~")
#創建一個頂級菜單
menubar=Menu(root)
#創建一個下拉菜單「文件」,然後將它添加到頂級菜單中
filemenu=Menu(menubar,tearoff=False)
filemenu.add_command(label="打開",command=callback,accelerator='Ctrl+N')
filemenu.add_command(label="保存",command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出",command=root.quit)
menubar.add_cascade(label="文件",menu=filemenu)
#顯示菜單
root.config(menu=menubar)
root.bind_all("<Control-n>",lambdaevent:print('加速鍵Ctrl+N'))
mainloop()

效果如下:

備註:accelerator
1. 顯示該菜單項的加速鍵(快捷鍵)
2. 例如 accelerator = "Ctrl+N"
3. 該選項僅顯示,並沒有實現加速鍵的功能(通過按鍵綁定實現)

Ⅳ python:如何在QSplitter分割後的字窗口中,創建不同的右鍵菜單


兩種方法:1.在QSplitter創建實例的時候,構造函數傳遞主窗口的參數。
2.使用QLayout子類管理窗口


1例:QSplitter*mysp=newQSplitter(this);//this指針是主窗口
2例:QGridLayout*mainly=newQGridLayout;//也可以使用水平對齊或垂直對齊
mainly->add(mysp,0,0);
this->setLayout(mysp);



Ⅳ python Tkinter庫之OptionMenu控制項問題

'''Tkinter教程之OptionMenu篇'''
#OptionMenu為可選菜單,與Combox功能類似。
'''1.創建OptionMenu'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar(root)
v.set('Python')
om = OptionMenu(root,v,'Python','PHP','CPP','C','Java','JavaScript','VBScript')
om.pack()

root.mainloop()
#顯示的文本自動斷行,上下行分別使用了左對齊,右對齊和居中對齊
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar(root)
#創建一個OptionMenu控制項
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.pack()

root.mainloop()
#OptionMenu的創建需要兩個必要的參數,與當前值綁定的變數,通常為一StringVar類型;另一
#個是提供可選的內容列表,由OptionMenu的變參數指定。

'''2.設置OptionMenu的顯示值'''
#當OptionMenu與變數綁定後,直接使用變數賦值的方法即可改變當前的值
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar(root)
v.set('VBScript')
#創建一個OptionMenu控制項
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.pack()
print v.get()

root.mainloop()
#運行程序,OptionMenu默認值為"VBScript",列印出的數值也為"VBScript"
#如果設置的值不包含在當前的列表中,會是什麼結果?如下的代碼使用"Tkinter"來測試
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar(root)
v.set('Tkinter')
#創建一個OptionMenu控制項
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.pack()
print v.get()

root.mainloop()
#程序依舊是默認值改變為Tkinter,列印結果也變為Tkinter,但Tkinter不會添加到OptionMenu的列表中,也就是說,當選擇其它的選項時,Tkinter的值會丟失。
'''3.列印OptionMenu的值'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar(root)
v.set('Tkinter')
def printOption(event):
print v.get()
#創建一個OptionMenu控制項
om = OptionMenu(root,
v,
'Python',
'PHP',
'CPP',
'C',
'Java',
'JavaScript',
'VBScript'
)
om.bind('<Button-1>',printOption)
om.pack()

root.mainloop()
#每次點擊OptionMenu程序列印出上次選中的項值
'''使用list作為OptionMenu的選項'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
Lang = ['Python','PHP','CPP','C','Java','JavaScript','VBScript']
v = StringVar(root)
v.set('Tkinter')
def printOption(event):
print v.get()
#創建一個OptionMenu控制項,使用了apply函數
om = apply(OptionMenu,(root,v) + tuple(Lang))
om.bind('<Button-1>',printOption)
om.pack()

root.mainloop() =================================================================='''Tkinter教程之Grid篇'''
# Tkinter參考中最推薦使用的一個布局器。實現機制是將Widget邏輯上分割成表格,在指定的位置放置想要的Widget就可以了。
'''1.第一個Grid例子'''
# -*- coding: cp936 -*-
# 使用grid來布局組件
from Tkinter import *
root = Tk()
# 創建兩個Label
lb1 = Label(root,text = 'Hello')
lb2 = Label(root,text = 'Grid')

lb1.grid()
lb2.grid()

root.mainloop()
# grid有兩個最為重要的參數,用來指定將組件放置到什麼位置,一個是row,另一個是column。如果不指定row,會將組件放置到第一個可用的行上,如果不指定column,則使用第一列。
'''2.使用row和column來指定位置'''
# -*- coding: cp936 -*-
# 使用grid來布局組件
from Tkinter import *
root = Tk()
# 創建兩個Label
lb1 = Label(root,text = 'Hello')
lb2 = Label(root,text = 'Grid')

lb1.grid()
# 指定lb2為第一行(使用索引0開始),第二列(使用索引0開始)
lb2.grid(row = 0,column = 1)

root.mainloop()
# grid有兩個最為重要的參數,用來指定將組件放置到什麼位置,一個是row,另一個是column。如果不指定row,會將組件放置到第一個可用的行上,如果不指定column,則使用第一列。注意這里使用grid時不需要創建,直接使用行列就可以。
'''3.為其它組件預定位置'''
# 可以使用row/column來指定組件的放置位置,並預先留出空間,以務其它需要。
# -*- coding: cp936 -*-
# 使用grid來布局組件
from Tkinter import *
root = Tk()
# 創建兩個Label
Label(root,text = 'Hello').pack()
# 在第一行,第10列放置lb2
Label(root,text = 'Grid').grid(row = 0,column = 10)
# Lable(root,text = '3').grid(row = 0,column = 5)
root.mainloop()
# 這個例子中將lb2放置到第1行,第11列位置上,但運行結果與上一例從效果上看不出太大的區別。原因是:如果這個位置沒有組件的話,它是看不可見的。
'''4.將組件放置到預定位置上去'''
# -*- coding: cp936 -*-
# 使用grid來布局組件
from Tkinter import *
root = Tk()
# 創建兩個Label
Label(root,text = '1').grid()
# 在第1行,第11列放置lb2
Label(root,text = '2').grid(row = 0,column = 10)
Label(root,text = '3').grid(row = 0,column = 5)
root.mainloop()
# 可以看到Label('3')是位置Label('1')和Label('2')之間了,即Label('2')是在11列,Label('3')位於第3列
'''5.將兩個或多個組件同一個位置'''
# -*- coding: cp936 -*-
# 多個組件同時grid到同一個表格位置
from Tkinter import *
root = Tk()
# 創建兩個Label
lb1 = Label(root,text = '1')
lb2 = Label(root,text = '2')

# 將lb1和lb2均grid到(0,0)位置
lb1.grid(row = 0,column = 0)
lb2.grid(row = 0,column = 0)

def forgetLabel():
# grid_slaves返回grid中(0,0)位置的所有組件
# grid_forget將這個組件從grid中移除(並未刪除,可以使用grid再將它顯示出來)
print root.grid_slaves(0,0)[0].grid_forget()

# 我測試時grid_salves返回的第一個值為lb2,最後grid的那一個
Button(root,text = 'forget last',command = forgetLabel).grid(row = 1)

root.mainloop()
# 這段代碼是用來證明,多個組件同時放置到同一個位置上會產生覆蓋的問題。對於grid_slaves返回的組件list如何排序,我沒有去查想著資料,在這個例子中使用索引0,返回的正好是lb2,然後再使用grid_forget將這個刪除從grid中移除,可以看到lb1顯示出來了。
'''6.改變列(行)的屬性值'''
# -*- coding: cp936 -*-
# 設置column的屬性(columnconfigure)
from Tkinter import *
root = Tk()
# 創建兩個Label
lb1 = Label(root,text = '1',bg = 'red')
lb2 = Label(root,text = '2',bg = 'blue')

# 將lb1和lb2分別放置到第1行的1,2列位置上
lb1.grid(row = 0,column = 0)
lb2.grid(row = 0,column = 1)

# 指定列的最小寬度為100
root.columnconfigure(0,minsize = 100)
root.mainloop()
# 1與2的距離變的遠一些了。
# 但如果這個位置沒有組件存在的話這個值是不起作用的.
# 設置列或行(rowconfigure)的屬性時使用父容器的方法,不是自己調用。
'''7.組件使用多列(多行)'''
# -*- coding: cp936 -*-
# 使用多行(多列)
from Tkinter import *
root = Tk()
# 創建如下布局(一個字元佔用一個grid位置)
# A E
# B C
# D
# A佔用(0,0)(0,1),B佔用(1,0),C佔用(1,1),D佔用(2,0),E佔用(0,2)
# 創建5個Label,分別以背景色區別
lbA = Label(root,text = 'A',bg = 'red')
lbB = Label(root,text = 'B',bg = 'blue')
lbC = Label(root,text = 'C',bg = 'red')
lbD = Label(root,text = 'D',bg = 'blue')
lbE = Label(root,text = 'E',bg = 'blue')
# 以下為布局參數設置
lbA.grid(row = 0,column = 0,columnspan = 2)
lbB.grid(row = 1,column = 0)
lbC.grid(row = 1,column = 1)
lbD.grid(row = 2)
lbE.grid(row = 0,column = 2)

root.mainloop()
# A與B、D的區別,它左邊已改變,由於使用了兩個表格;
# C與E的區別:C的右邊與E的左邊對齊,也就是說E被放置到第2列的下一個位置了,原因由於A已使用了第2列。
'''8.設置表格中組件的對齊屬性'''
# -*- coding: cp936 -*-
# 使用sticky設置對齊方式
from Tkinter import *
root = Tk()
# 創建兩個Label
Label(root,text = 'hello sticky').grid()
Label(root,text = 'Tkinter').grid()
# 創建兩個Label,並指定sticky屬性
Label(root,text = 'hello sticky').grid(sticky = W)
Label(root,text = 'Tkinter').grid(sticky = W)

root.mainloop()
# 默認屬性下,組件的對齊方式為居中,設置sticky屬性可以控制對齊方式,可用的值(N,S,E,W)及其組合值

Ⅵ 怎麼用python在linux下編寫菜單

你可以使用tkinter這個python自帶的gui庫,完全跨平台,可以滿足你的需求。
import tkinter

如果解決了您的問題請採納!
如果未解決請繼續追問

Ⅶ python文本菜單的程序

#!/usr/bin/envpython3#py3.6+
"""
#要求做一個系統菜單,輸入數字進入對應菜單,包含以下內容,正常操作不能報錯:
#菜單1:列印所有產品價格和庫存
#菜單2:修改產品價格
#菜單3:增加庫存
#菜單4:購買指定數量產品
#菜單5:增加新產品作為思考題
#菜單0:退出當前系統
"""

price={'vegetables':'3','eggs':'4','rice':'2'}#價格dict
stock={'vegetables':'0','eggs':'0','rice':'0'}#庫存dict

tip='''
1:列印所有產品價格和庫存
2:修改產品價格
3:增加庫存
4:購買指定數量產品
5:增加新產品作為思考題
0:退出當前系統
'''

defmain():
whileTrue:
globalprice,stock
a=input(f'Pleaseenteranumber:{tip} ').strip()
ifa=='0':
print('Exit!')
break
elifa=='1':
style='{:15}{:6}{:5}'
print(style.format('Name','price','stock'))
for(n,p),(_,s)inzip(price.items(),stock.items()):
print(style.format(n,p,s))
print()
elifa=='2':
whileTrue:
n=input(':')
ifninprice:
break
print('invalidinput!Shouldbe"{}".'.format(
'"or"'.join(price)))
p=input('enteranewpriceofthisproct:')
price[n]=p
elifa=='3':
whileTrue:
n=input(':')
ifninstock:
break
print('Invalidinput!Shouldbe"{}".'.format(
'"or"'.join(stock)))
whileTrue:
s=input(':')
try:
s=int(s)
break
except:
print('Invalidinput,mustbeainteger!')
stock[n]=str(int(stock[n])+s)
elifa=='4':
whileTrue:
n=input('enteraproctnametobuyit:')
ifninstock:
break
print('Invalidinput!Shouldbe"{}".'.format(
'"or"'.join(stock)))
whileTrue:
s=input('enteraintegerforhowmanytobuy:')
try:
s=int(s)
ifs<=0ors>int(stock[n]):
raise
break
except:
print('Invalidinput,mustbeapositiveintegerand'
'lessthan{}!'.format(stock[n]))
y=input('Youwanttobuy{}X{},whichcost{}?(y)/n'.format(
n,s,int(price[n])*s))
ify.strip().lower()in('y',''):
stock[n]=str(int(stock[n])-s)
print('Youpay{}andget{}{}'.format(int(price[n]*s),s,n))
elifa=='5':
print('Uncomplete... ')

if__name__=='__main__':
main()

Ⅷ 如何構建命令行下的Python菜單選項

我還沒發現有現成的第三方庫解決這么簡單的問題,自己可以用循環和條件語句結構寫一個程序然後作為庫使用

閱讀全文

與python中menu菜單創建相關的資料

熱點內容
願望清單app哪個好 瀏覽:457
安卓外放聲音怎麼解決 瀏覽:194
脈脈app干什麼用的 瀏覽:357
拽姐是哪個app 瀏覽:858
雲伺服器刪除了還有嗎 瀏覽:232
macbook可以用單片機嘛 瀏覽:307
南陽php招聘 瀏覽:814
去哪裡找按摩師很漂亮的app 瀏覽:818
86x99用簡便演算法計算 瀏覽:830
php截圖flash 瀏覽:274
卸載聯想app哪個好 瀏覽:721
php文字轉圖片 瀏覽:332
豆客後台怎麼加密碼 瀏覽:575
jpg轉換pdf破解版 瀏覽:979
php基礎書籍推薦 瀏覽:779
伺服器與外網不通如何驗證 瀏覽:353
電子版是不是就是文件夾 瀏覽:52
游戲屬性文件加密 瀏覽:464
如何讓安卓手機桌面圖標下移 瀏覽:530
ubuntuphp5環境搭建 瀏覽:101