[英]OpenERP 7 : How can I make a button inserting a predefined text in the Clipboard?
我是OpenERP和Python的新手,這是我的問題:
在表單視圖中,用戶可以看到一個客戶的地址,我的任務是添加一個按鈕,當用戶單擊該按鈕時,該地址會保存在剪貼板中,因此用戶只需將其粘貼到他想要的位置即可,而不是選擇文本並使用快捷鍵進行復制。
這是我嘗試過的最后一件事,我對人們在Internet上給出的許多不同答案感到有些困惑,但我對功能還不太滿意:
from openerp.osv import fields, orm
import sys
import gtk
import pygtk
pygtk.require('2.0')
class address_copy(orm.Model):
_inherit = "res.partner"
def address_copy(self, cr, uid, ids, context=None):
if context is None:
context = {}
address = partner.street + '\n' + partner.zip + ' ' + partner.city + '\n' + partner.country_id + ', ' + partner.state_id
self.clipboard_clear()
self.clipboard_append(address)
使用此模塊更新數據庫時沒有任何問題,但是當我單擊創建的按鈕時,出現此錯誤:
2015-05-01 15:45:12,305 20229 ERROR Armand openerp.osv.osv: Uncaught exception
Traceback (most recent call last):
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 132, in wrapper
return f(self, dbname, *args, **kwargs)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 199, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 187, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/home/odoo/addons/7.0/purchase/partner.py", line 44, in copy
return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
TypeError: copy() got an unexpected keyword argument 'default'
2015-05-01 15:45:12,305 20229 ERROR Armand openerp.netsvc: copy() got an unexpected keyword argument 'default'
Traceback (most recent call last):
File "/home/odoo/server/7.0/openerp/netsvc.py", line 296, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/home/odoo/server/7.0/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 190, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 132, in wrapper
return f(self, dbname, *args, **kwargs)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 199, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 187, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/home/odoo/addons/7.0/purchase/partner.py", line 44, in copy
return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
TypeError: copy() got an unexpected keyword argument 'default'
因此,問題似乎出在partner.py中的此復制函數中,盡管我的課程繼承了該模塊,但我並未對其進行任何更改,並且我並不真正知道它是如何工作的。 這是partner.py中的復制功能:
from openerp.osv import fields, osv
class res_partner(osv.osv):
_name = 'res.partner'
_inherit = 'res.partner'
def copy(self, cr, uid, id, default=None, context=None):
if default is None:
default = {}
default.update({'purchase_order_ids': []})
return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
_columns = {
'property_product_pricelist_purchase': fields.property('product.pricelist', type='many2one', relation='product.pricelist', domain=[('type','=','purchase')], string="Purchase Pricelist", view_load=True, help="This pricelist will be used, instead of the default one, for purchases from the current partner"),
'purchase_order_count': fields.function(_purchase_order_count, string='# of Purchase Order', type='integer'),
'purchase_order_ids': fields.one2many('purchase.order','partner_id','Purchase Order')
}
res_partner()
您是否知道如何使它起作用? 我的功能也可能是錯誤的。 在此先感謝所有嘗試幫助我的人! 如果太復雜,也許也可以選擇僅選擇文本以便用戶直接復制的按鈕。
編輯:如果我嘗試從OpenERP的銷售模塊中啟動它,使用一個簡單的按鈕和一個函數“ pyperclip.copy(” string“),就會出現此錯誤:
OpenERP Server Error
Client Traceback (most recent call last):
File "/home/odoo/web/7.0/addons/web/http.py", line 204, in dispatch response["result"] = method(self, **self.params)
File "/home/odoo/web/7.0/addons/web/controllers/main.py", line 1132, in call_button
action = self._call_kw(req, model, method, args, {})
File "/home/odoo/web/7.0/addons/web/controllers/main.py", line 1120, in _call_kw
return getattr(req.session.model(model), method)(*args, **kwargs)
File "/home/odoo/web/7.0/addons/web/session.py", line 42, in proxy
result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
File "/home/odoo/web/7.0/addons/web/session.py", line 30, in proxy_method
result = self.session.send(self.service_name, method, *args)
File "/home/odoo/web/7.0/addons/web/session.py", line 103, in send
raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)
Server Traceback (most recent call last):
File "/home/odoo/web/7.0/addons/web/session.py", line 89, in send
return openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/home/odoo/server/7.0/openerp/netsvc.py", line 296, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/home/odoo/server/7.0/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 190, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 132, in wrapper
return f(self, dbname, *args, **kwargs)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 199, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/home/odoo/server/7.0/openerp/osv/osv.py", line 187, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/home/odoo/personnal_addons/sale_option/sale_option.py", line 664, in copy
return super(sale_order, self).copy(cr, uid, id, default, context=context)
File "/home/odoo/addons/7.0/sale_stock/sale_stock.py", line 49, in copy
return super(sale_order, self).copy(cr, uid, id, default, context=context)
File "/home/odoo/addons/7.0/sale/sale.py", line 87, in copy
return super(sale_order, self).copy(cr, uid, id, default, context=context)
File "/home/odoo/server/7.0/openerp/osv/orm.py", line 5126, in copy
data = self.copy_data(cr, uid, id, default, context)
File "/home/odoo/addons/7.0/mail/mail_thread.py", line 326, in copy_data
return super(mail_thread, self).copy_data(cr, uid, id, default=default, context=context)
File "/home/odoo/server/7.0/openerp/osv/orm.py", line 5023, in copy_data
data = self.read(cr, uid, [id], fields_to_copy.keys(), context=context)
File "/home/odoo/server/7.0/openerp/osv/orm.py", line 3679, in read
result = self._read_flat(cr, user, select, fields, context, load)
File "/home/odoo/server/7.0/openerp/osv/orm.py", line 3730, in _read_flat for sub_ids in cr.split_for_in_conditions(ids):
File "/home/odoo/server/7.0/openerp/sql_db.py", line 258, in split_for_in_conditions
return tools.misc.split_every(self.IN_MAX, set(ids))
TypeError: unhashable type: 'list'
您的代碼中有很多問題。 因此,除非您最清楚地了解問題,否則就很難找到問題。
在這段代碼中
address = partner.street + '\n' + partner.zip + ' ' + partner.city + '\n' + partner.country_id + ', ' + partner.state_id
您沒有partner
對象來獲取地址詳細信息。
然后在這段代碼中
partner.country_id
和partner.state_id
您將獲得一個對象。 因此,您需要使用partner.country_id.name
或所需的任何字段。
然后在這段代碼中,我希望您嘗試使用tkinter
模塊執行剪貼板操作。
self.clipboard_clear()
self.clipboard_append(address)
為此,您需要tkinter
類中的一個對象。 它是一個跨平台的GUI庫。 嘗試這個
from openerp.osv import fields, orm
from Tkinter import Tk
class address_copy(orm.Model):
_inherit = "res.partner"
def address_copy(self, cr, uid, ids, context=None):
if context is None:
context = {}
for partner in self.browse(cr, uid, ids, context=context):
r = Tk()
address = str(partner.street) + '\n' + str(partner.zip) + ' ' + str(partner.city) + '\n' + str(partner.country_id.name) + ', ' + str(partner.state_id.name)
r.withdraw()
r.clipboard_clear()
r.clipboard_append(address)
r.destroy()
在python3中, from Tkinter import Tk
應該是from tkinter import Tk
。 由於Odoo使用上面的python2.x不會有問題。
或者您可以使用pyperclip模塊。 它將以最少的代碼正常運行。
簡單的例子:
import pyperclip
pyperclip.copy('The text to be copied to the clipboard.')
spam = pyperclip.paste()
print spam
對於您的情況:
from openerp.osv import fields, orm
import pyperclip
class address_copy(orm.Model):
_inherit = "res.partner"
def address_copy(self, cr, uid, ids, context=None):
if context is None:
context = {}
for partner in self.browse(cr, uid, ids, context=context):
address = str(partner.street) + '\n' + str(partner.zip) + ' ' + str(partner.city) + '\n' + str(partner.country_id.name) + ', ' + str(partner.state_id.name)
pyperclip.copy(address)
我個人更喜歡最后一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.