当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [gtk3]显示不出菜单
帖子发表于 : 2013-02-17 18:17 
头像

注册: 2008-06-23 15:19
帖子: 3051
地址: 北欧某国
系统: ���������
送出感谢: 21
接收感谢: 6
建立菜单的代码都在 create_menu 当中了,其它的都可以跳过去不看。

[python]#!/usr/bin/python
#coding:utf8

from gi.repository import Gtk, Pango, GtkSource, Gdk, GObject
import os

class SearchDialog(Gtk.Dialog):
"""这里是一个在文本中搜索字符串的对话框。"""
def __init__(self, parent):
Gtk.Dialog.__init__(self, "Search", parent,
Gtk.DialogFlags.MODAL, buttons=(
Gtk.STOCK_FIND, Gtk.ResponseType.OK,
Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL
)
)

box = self.get_content_area()

box.add(Gtk.Label("查找:"))

self.entry = Gtk.Entry()
box.add(self.entry)

self.show_all()


class TextViewWindow(Gtk.Window):
"""程序的主要部分"""
def __init__(self):
Gtk.Window.__init__(self, title="带背景的文本编辑器")

GObject.signal_new("changed", BEditDocument, GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE, ())

self.set_default_size(560, 350)
self.create_notebook()
self.create_menubar()
self.create_toolbar()

self.on_new()
self.set_style()


def create_toolbar(self):
"""建立工具栏,这里的工具栏,实际上是选项卡上的一些标签页。"""

button = [Gtk.ToolButton.new_from_stock(Gtk.STOCK_NEW),
Gtk.MenuToolButton.new_from_stock(Gtk.STOCK_OPEN),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_SAVE),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_PRINT),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_UNDO),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_REDO),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_CUT),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_COPY),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_PASTE),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_FIND),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_FIND_AND_REPLACE),
Gtk.ToolButton.new_from_stock(Gtk.STOCK_PREFERENCES)]

for i in button:
self.notebook.append_page(Gtk.Box(spacing=6), i)

button[0].connect("clicked", self.on_new)
button[1].connect("clicked", self.on_open_file)
button[2].connect("clicked", self.on_save)
button[9].connect("clicked", self.on_find)
button[-1].connect("clicked", self.on_preferences)

def create_menubar(self):
"""建立一个菜单栏"""
mb = Gtk.MenuBar()

#文件菜单
filemenu = Gtk.Menu()

new = Gtk.MenuItem.new_with_label("新建")
filemenu.append(new)

openitem = Gtk.MenuItem.new_with_label("打开")
filemenu.append(openitem)

sep = Gtk.SeparatorMenuItem()
filemenu.append(sep)

save = Gtk.MenuItem.new_with_label("保存")
filemenu.append(save)

filem = Gtk.MenuItem.new_with_label("文件")
filem.set_submenu(filemenu)

mb.set_vexpand(False)
mb.append(filem)

#查看菜单
viewmenu = Gtk.Menu()

wrap = Gtk.MenuItem.new_with_label("自动换行")
viewmenu.append(wrap)

viewm = Gtk.MenuItem.new_with_label("查看")
viewm.set_submenu(viewmenu)

mb.set_vexpand(False)
mb.append(viewm)


def create_notebook(self):
"""建立选项卡"""
self.notebook = Gtk.Notebook()
self.add(self.notebook)

def on_new(self, widget = None):
"""在这里新建一个文档"""
new_textview = BEditDocument()
new_textview.connect("changed", self.on_update_title)
new_scrolledwindow = Gtk.ScrolledWindow()
new_scrolledwindow.set_hexpand(True)
new_scrolledwindow.set_vexpand(True)
new_scrolledwindow.add(new_textview)

new_label = Gtk.Label("无标题文档")
self.notebook.append_page(new_scrolledwindow, new_label)
#切换到刚插入的一页
self.show_all()
self.notebook.set_current_page(self.notebook.get_n_pages()-1)

def on_open_file(self, widget):
dialog = Gtk.FileChooserDialog("打开文件", self,
Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

self.add_filters(dialog)

response = dialog.run()
if response == Gtk.ResponseType.OK:
# 判断最后一个标签里面是否是空文档
last_doc = self.notebook.get_nth_page(-1).get_child()
if last_doc.filename != "无标题文档" or last_doc.change_number > 0 or last_doc.stext != "":
self.on_new()
last_doc = self.notebook.get_nth_page(-1).get_child()
last_doc.open(dialog.get_filename())

dialog.destroy()

def on_save(self, widget = None):
cur_wid = self.notebook.get_nth_page(self.notebook.get_current_page()).get_child()
# 判断文件是否有文件名
if cur_wid.filepath == "":
dialog = Gtk.FileChooserDialog("另存为", self,
Gtk.FileChooserAction.SAVE,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_SAVE, Gtk.ResponseType.OK))

self.add_filters(dialog)

response = dialog.run()
if response == Gtk.ResponseType.OK:
cur_wid.save(dialog.get_filename())
dialog.destroy()
else:
# 直接使用已经存在的文件名
cur_wid.save()


def on_find(self, widget = None):
dialog = SearchDialog(self)
response = dialog.run()
if response == Gtk.ResponseType.OK:
cursor_textbuffer = self.notebook.get_nth_page(self.notebook.get_current_page()).get_child().get_buffer()
cursor_mark = cursor_textbuffer.get_insert()
start = cursor_textbuffer.get_iter_at_mark(cursor_mark)
if start.get_offset() == self.textbuffer.get_char_count():
start = self.textbuffer.get_start_iter()

self.search_and_mark(dialog.entry.get_text(), start)

dialog.destroy()

def on_preferences(self, widget = None):
print """显示属性对话框"""

def on_update_title(self, widget = None):
"""更新标题栏"""
cw = self.notebook.get_nth_page(self.notebook.get_current_page())
cwt = cw.get_child()
if cwt.change_number == 0:
self.set_title(cwt.filename+" ("+cwt.filepath+") - bedit")
new_label = Gtk.Label(cwt.filename)
self.notebook.set_tab_label(cw, new_label)
else:
self.set_title("*" + cwt.filename+" ("+cwt.filepath+") - bedit")
new_label = Gtk.Label("*" + cwt.filename)
self.notebook.set_tab_label(cw, new_label)
new_label.set_name("BEditTabLabel")

def add_filters(self, dialog):
filter_text = Gtk.FileFilter()
filter_text.set_name("文本文件")
filter_text.add_mime_type("text/plain")
dialog.add_filter(filter_text)

filter_py = Gtk.FileFilter()
filter_py.set_name("Python 文件")
filter_py.add_mime_type("text/x-python")
dialog.add_filter(filter_py)

filter_any = Gtk.FileFilter()
filter_any.set_name("所有文件")
filter_any.add_mime_type("*")
dialog.add_filter(filter_any)

def set_style(self):
"""用来设置外观"""

css = """
GtkWindow {
background-image: url('/home/liu/.local/share/gedit/plugins/wallpaper_74694_1024.jpg');
}
GtkNotebook {
background-color: RGBA(224,224,224,0.5);
}
GtkScrolledWindow , GtkSourceView {
background-color: RGBA(224,0,0,0);
}
GtkSourceView:selected { background-color: #F80; }
"""
style_provider = Gtk.CssProvider()
style_provider.load_from_data(css)
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)


class BEditDocument(GtkSource.View):
"""为 GtkSource.View 添加一些原来没有的东西。"""
def __init__(self):
GtkSource.View.__init__(self)
self.filename = "无标题文档"
self.filepath = ""
self.stext = ""
self.change_number = 0

#修改后的信号
self.get_buffer().connect("changed", self.text_change)
self.load_config()


def text_change(self, buffer):
text = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), False)
if self.stext == text:
if self.change_number > 0:
self.change_number = 0
#发出改变标题栏的信号
self.emit('changed')
#如果被修改了
else:
self.change_number = self.change_number+1
if self.change_number == 1:
self.emit('changed')

def open(self, filename):
# 在这里读取文件
file_object = open(filename)
try:
self.stext = file_object.read()
self.get_buffer().set_text(self.stext)
# 将绝对路径分解成路径和文件名
self.filepath , self.filename = os.path.split(filename)
self.emit('changed')
finally:
file_object.close()

def save(self, filename = ""):
"""在这里保存文件"""
if filename == "":
file_object = open(self.filepath + "/" + self.filename, 'w')
else:
file_object = open(filename, 'w')
try:
self.stext = self.get_buffer().get_text(self.get_buffer().get_start_iter(), self.get_buffer().get_end_iter(), False)
file_object.write(self.stext)
# 将绝对路径分解成路径和文件名
self.filepath , self.filename = os.path.split(filename)
self.change_number = 0
self.emit('changed')
finally:
file_object.close()

def load_config(self):
"""读取配置文件"""
file_object = open(os.environ['HOME']+"/.local/share/bedit/config")
try:
for eachline in file_object:
els = eachline.split()
if els[0] == "wrap_mode":
if els[1] == "NONE":
self.set_wrap_mode(Gtk.WrapMode.NONE)
if els[1] == "CHAR":
self.set_wrap_mode(Gtk.WrapMode.CHAR)
if els[1] == "WORD":
self.set_wrap_mode(Gtk.WrapMode.WORD)
if els[1] == "WORD_CHAR":
self.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
finally:
file_object.close()


if __name__ == "__main__":
win = TextViewWindow()
win.connect("delete-event", Gtk.main_quit)
#win.show_all()
Gtk.main()[/python]

还有一个小问题,我用 Gtk.StyleContext.add_provider_for_screen 设置背景颜色,如果我想单独设置某个标签的背景该怎么办?nth-child(first) 和 nth-child(2n+1) 都可以用,但是 nth-child(10+n) 却不能用。。。


_________________
http://noie.name 网站改版中。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译